Files
labs/labPython/lab2/windows.py
2026-04-18 14:42:00 +05:00

277 lines
5.1 KiB
Python
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import curses
class InputWindow(): # Позиция x, позиция y, ширина, высота, текст окна.
def __init__(self, position_x, position_y, width, heigth, text="", xMax=6):
self.x = position_x
self.y = position_y
self.w = width
self.h = heigth
self.t = text
self.inputwin = curses.newwin(self.h-2, self.w-3, self.y+1, self.x+2) # Разметка окна ввода
self.win = curses.newwin(self.h, self.w, self.y, self.x) # Основное окно с рамкой
self.xMax = xMax
def draw(self):
# Главное окно
self.win.border() # Рамка
self.win.addstr(0, 1, self.t) # Надпись на окне(не более 8 символов)
self.win.refresh()
self.inputwin.refresh()
def edit(self): # Статическое окно
input = self.inputwin # Окно ввода
input.clear()
text = "" # Возвращаемый текст
cursX = 0 # Позиция курсора
while True:
# Каждую итерацию цикла отрисовываем окно, ждем ввод, в зависимости от ввода делаем действие
input.addstr(0, 0, text)
input.move(0, cursX)
self.win.refresh()
self.inputwin.refresh()
ch = input.getch()
if ch == 7: # Проверяем на Ctrl+g
return text
elif ch == 10: # Проверям на enter
return text
elif cursX > self.w-5:
StaticWindow(1, 0, f"Maximum lenght {self.w-4}")
elif ch == 127: # Проверяем на backspace
if text!="":
text = text[:-1]
cursX -= 1
input.clear()
input.refresh()
else: # Отрисосвываем текст
text += chr(ch)
cursX += 1
def editResize(self): # Динамически масштабируемое окно
input = self.inputwin # Окно ввода
input.clear()
text = "" # Возвращаемый текст
cursX = 0 # Позиция курсора
while True:
# Каждую итерацию цикла отрисовываем окно, ждем ввод, в зависимости от ввода делаем действие
input.addstr(0, 0, text)
input.move(0, cursX)
self.win.refresh()
self.inputwin.refresh()
ch = input.getch()
if ch == 7: # Проверяем на Ctrl+g
return text
elif ch == 10: # Проверям на enter
return text
elif ch == 127: # Проверяем на backspace
if text!="":
text = text[:-1]
cursX -= 1
input.clear()
input.refresh()
elif len(text) <= (self.xMax - 6): # Отрисосвываем текст
text += chr(ch)
cursX += 1
if cursX > self.w-4: # Динамическое увеличение рамки и текстового поля
self.x -=1
self.w +=2
input.mvwin(self.y+1, self.x+2)
self.win.mvwin(self.y, self.x)
input.resize(self.h-2, self.w-3) # Разметка окна ввода
self.win.resize(self.h, self.w) # Основное окно с рамкой
self.win.border()
self.win.addstr(0, 1, self.t) # Надпись на окне(не более 8 символов)
def clear(self):
self.inputwin.clear()
self.inputwin.refresh()
class StaticWindow(): # Поция x, позиция y, текст
def __init__(self, position_x, position_y, text, textInline="", reverse=False, minHeigtg=False):
self.x = position_x
self.y = position_y
if len(text) < 20 and minHeigtg:
self.w = 24
else:
self.w = len(text)+4
self.h = 3
self.t = text
self.ti = textInline
self.r = reverse
self.win = curses.newwin(self.h, self.w, self.y, self.x)
def draw(self):
if self.r:
self.win.attron(curses.A_REVERSE)
self.win.border()
self.win.attroff(curses.A_REVERSE)
self.win.attron(curses.A_REVERSE)
self.win.addstr(0, 1, self.ti)
self.win.attroff(curses.A_REVERSE)
else:
self.win.border()
self.win.addstr(0, 1, self.ti)
self.win.addstr(1,2, self.t)
self.win.refresh()
def clear(self):
self.win.clear()
self.win.refresh()