Пользователь Python / curses при обновлении экрана
В настоящее время я пишу приложение U.I с помощью python / curses, и мне было интересно, можно ли попросить пользователя нажимать клавиши (режим cbreak), чтобы скрыть или показать некоторые панели или окна, пока U.I постоянно обновляется.
Я прочитал официальные документы Python о проклятиях и сделал несколько попыток, но даже с использованием режима cbreak и активированного неблокирующего режима ввода (nodelay) я не могу заставить его работать должным образом (мне удается получить пользовательский ввод, но в за счет блокировки пользовательского интерфейса это не то, что я хочу).
Так что мой вопрос прост, возможно ли? И если да, то как?
Возможно, я неправильно прочитал документы, но я не нашел альтернативных документов или примеров по этому поводу.
Я думал о том, чтобы сделать приложение многопоточным, но я не видел, как это может помочь мне в этом случае.
Спасибо за вашу помощь, советы или указатель на подробный документ.
РЕДАКТИРОВАТЬ :
Я наконец закончил со следующим многопоточным кодом, но это не удовлетворяет. U.I подается так, как и должно быть, но после обновления экран отображается на экране.
Я также не понимаю, почему curses.panel.hidden () возвращает False, в то время как рассматриваемая панель скрыта. Похоже, что при обновлении окна, связанного с панелью, панель скрывается или что-то в этом роде. Я действительно потерян в этот момент!
import threading
import curses, curses.panel
import random
import time
gui = None
class ui:
def __init__(self):
self.feeder = feeder(self)
self.stdscr = curses.initscr()
curses.noecho()
curses.cbreak()
curses.curs_set(0)
self.stdscr.keypad(1)
self.win1 = curses.newwin(10, 50, 0, 0)
self.win1.border(0)
self.pan1 = curses.panel.new_panel(self.win1)
self.win2 = curses.newwin(10, 50, 0, 0)
self.win2.border(0)
self.pan2 = curses.panel.new_panel(self.win2)
self.win3 = curses.newwin(10, 50, 12, 0)
self.win3.border(0)
self.pan3 = curses.panel.new_panel(self.win3)
self.win1.addstr(1, 1, "Window 1")
self.win2.addstr(1, 1, "Window 2")
self.win3.addstr(1, 1, "Press 's' to switch windows or 'q' to quit.")
self.pan1.hide()
self.win1.refresh()
curses.panel.update_panels()
self.win2.refresh()
self.feeder.start()
def ask(self):
while True:
self.win3.addstr(5,1, "Hidden = win1: "+str(self.pan1.hidden())+\
"win2:"+str(self.pan2.hidden()), 0)
self.win3.refresh()
k = self.win3.getkey()
if k == 's':
if self.pan1.hidden():
self.pan2.hide()
self.pan1.show()
self.win1.refresh()
self.win3.addstr(2, 1, "Pan1 restored")
else:
self.pan1.hide()
self.pan2.show()
self.win2.refresh()
self.win3.addstr(2, 1, "Pan2 restored")
self.win3.addstr(5,1, "Hidden = win1: "+\
str(self.pan1.hidden())+\
" win2:"+str(self.pan2.hidden()), 0)
elif k == 'q':
break
self.quit_ui()
def quit_ui(self):
self.feeder.stop()
curses.nocbreak()
self.stdscr.keypad(0)
curses.curs_set(1)
curses.echo()
curses.endwin()
exit(0)
def display_data(self, window, data):
window.addstr(3, 1, data, 0)
class feeder(threading.Thread):
# Fake U.I feeder
def __init__(self, ui):
super(feeder, self).__init__()
self.running = False
self.ui = ui
self.count = 0
def stop(self):
self.running = False
def run(self):
self.running = True
self.feed()
def feed(self):
while self.running:
self.ui.win1.addstr(3, 1, str(self.count)+\
": "+str(int(round(random.random()*9999))))
self.ui.win1.addstr(4, 1, str(self.running))
self.ui.win2.addstr(3, 1, str(self.count)+\
": "+str(int(round(random.random()*9999))))
self.ui.win2.addstr(4, 1, str(self.running))
time.sleep(0.5)
self.count += 1
if __name__ == "__main__":
gui = ui()
gui.ask()