Я работал над графическим интерфейсом терминала с использованием python и Проклятия в течение последних нескольких дней и чувствую, что не добился никакого прогресса. Сейчас мне нужно создать две панели, каждая из которых занимает половину экрана минус 1-2 символа в качестве поля. Я хочу, чтобы эти окна могли обрабатывать изменение размера, поэтому, если пользователь решит увеличить или уменьшить свой экран, размер моих панелей изменится в соответствии с потребностями пользователя.
+---------------------------+ +---------------------------+
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
+---------------------------+ +---------------------------+
В этот раз я могу нарисовать окна и изменить их размер. Проблема в том, что если я уменьшу размер меньше, чем то, что сейчас установлено в моих полях, я получаю сообщение об ошибке.
_curses_panel.error: move_panel() returned ERR
Я не уверен, связано ли это с тем, как я проверяю и изменяю размер окна, или с ограничением Curses.
Не могли бы вы взглянуть на мой код и сообщить, схожу я с ума или нет?
import curses
import curses.panel
screen = curses.initscr()
curses.start_color()
curses.noecho()
curses.curs_set(1)
screen.keypad(1)
curses.cbreak()
height,width = screen.getmaxyx()
window = curses.newwin(1,1,1,1)
window2 = curses.newwin(height -2 ,(width/2)-10, 1,width/2+1)
left_panel = curses.panel.new_panel(window)
right_panel = curses.panel.new_panel(window2)
window.border('|', '|', '-', '-', '+', '+', '+', '+')
window2.border('|', '|', '-', '-', '+', '+', '+', '+')
curses.panel.update_panels()
curses.doupdate()
running = True
x = 0
while ( running ):
height,width = screen.getmaxyx()
k = window.getch()
if k == curses.KEY_RESIZE:
window2.erase()
window.erase()
h, w = screen.getmaxyx()
window2.resize(height - 2 ,(width/2)-10)
window.resize(height - 2,(width/2) - 10)
left_panel.replace(window)
right_panel.replace(window2)
left_panel.move(0,0)
right_panel.move(0,width/2)
window2.border('|', '|', '-', '-', '+', '+', '+', '+')
window.border('|', '|', '-', '-', '+', '+', '+', '+')
if k == ord('q') or x >= 10:
running = False
curses.endwin()
curses.panel.update_panels()
curses.doupdate()
Этот код написан после того, как я провел много проб и ошибок, поэтому может быть какой-то код, который просто не имеет смысла, но вся логика для обработки изменения размера находится в этом выражении if.
if k == curses.KEY_RESIZE:
Я люблю вас. Я бы отметил ваш комментарий как резолюцию, но не думаю, что смогу сделать это с комментариями.






Я подозреваю, что проблема в том, что вы вызываете
screen.getmaxyx()перед вызовом.getch(), который возвращает событие изменения размера, и поэтому вы используете старые размеры экрана, а не новые.