我目前正在用python/curses编写一个应用程序U.I,我想知道是否可以要求用户按键(cbreak模式)来隐藏或显示一些面板或窗口,而U.I正在不断更新。在
我阅读了官方的python文档,并做了一些尝试,但即使使用cbreak模式和非阻塞输入模式(nodelay)激活,我也无法使其正常工作(我成功地获得用户输入,但以阻止不是我想要的U.I为代价)。在
所以我的问题很简单,有可能吗?如果是,怎么办?在
我可能读错了这些文档,但我没有找到其他文档或关于它的示例。在
我想让这个应用程序多线程,但我不知道这对我有什么帮助。在
感谢您的帮助、建议或指向详细文档的指针。在
编辑:
我最终得到了下面的多线程代码,但并不令人满意。 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()
我终于成功地通过读取系统标准然后避免使用另一个线程。 下面的代码可能无法在MS Windows上运行,由于我不是专业的开发人员,它可能未优化或抛出未捕获的错误,但它只是一个草稿,让我了解事情是如何工作的(尽管,欢迎评论)。 特别感谢保罗·格里菲斯,他引导我标准输入. 在
相关问题 更多 >
编程相关推荐