Python/Curses: 第一次按键时没有任何反应
Python/Curses: Nothing happens on first key press
代码:
from curses import curs_set, KEY_RESIZE, newwin, resize_term, wrapper
from curses.panel import *
VERSION = '0.0.0a'
class Editor:
def __init__(self, stdscr):
curs_set(0)
self.screen = stdscr
self.max_rows, self.max_cols = self.screen.getmaxyx()
self.panel = {
'titlebar': EditorPanel(1, self.max_cols, 0, 0),
'menubar': EditorPanel(1, self.max_cols-1, 2, 1)
}
self.panel['titlebar'].addstr(0, 0, f'Yedit {VERSION}')
self.panel['menubar'].addstr(0, 0, 'File | Edit | View | Help')
self.update()
def input_handler(self):
ch = self.screen.getch()
if ch == ord('q'):
return False
elif ch == KEY_RESIZE:
resize_term(*self.screen.getmaxyx())
self.update()
elif ch == ord('m'):
# print(ch)
self.panel['menubar'].toggle_visibility()
return True
def update(self):
for key in self.panel:
for argv in self.panel[key].text:
self.panel[key].window.addstr(*argv)
self.panel[key].window.refresh()
update_panels()
class EditorPanel:
def __init__(self, rows, cols, y, x):
self.window = newwin(rows, cols, y, x)
self.panel = new_panel(self.window)
self.text = []
def addstr(self, y, x, text):
self.text.append((y, x, text))
def toggle_visibility(self):
if self.panel.hidden():
self.panel.show()
else:
self.panel.hide()
self.window.refresh()
update_panels()
def main(stdscr):
yedit = Editor(stdscr)
while yedit.input_handler():
continue
wrapper(main)
问题:
当按下 'm' 键时,它会切换面板的可见性,但是在第一次按下 'm.' 时绝对没有任何反应。包含 print(ch)
语句来测试它。我省略了用于验证 ch
不是意外值的最终 else
语句。相反,按 'q' 会在第一次按键时按预期退出程序。
这是怎么回事?
您的代码中到处都是刷新。我不确定第一次按键不起作用的确切原因,但是如果您在事件循环中的单个位置处理刷新,例如...
def input_handler(self):
self.screen.refresh()
ch = self.screen.getch()
...
并删除对 "refresh" 的其他调用,隐藏功能正常运行
代码:
from curses import curs_set, KEY_RESIZE, newwin, resize_term, wrapper
from curses.panel import *
VERSION = '0.0.0a'
class Editor:
def __init__(self, stdscr):
curs_set(0)
self.screen = stdscr
self.max_rows, self.max_cols = self.screen.getmaxyx()
self.panel = {
'titlebar': EditorPanel(1, self.max_cols, 0, 0),
'menubar': EditorPanel(1, self.max_cols-1, 2, 1)
}
self.panel['titlebar'].addstr(0, 0, f'Yedit {VERSION}')
self.panel['menubar'].addstr(0, 0, 'File | Edit | View | Help')
self.update()
def input_handler(self):
ch = self.screen.getch()
if ch == ord('q'):
return False
elif ch == KEY_RESIZE:
resize_term(*self.screen.getmaxyx())
self.update()
elif ch == ord('m'):
# print(ch)
self.panel['menubar'].toggle_visibility()
return True
def update(self):
for key in self.panel:
for argv in self.panel[key].text:
self.panel[key].window.addstr(*argv)
self.panel[key].window.refresh()
update_panels()
class EditorPanel:
def __init__(self, rows, cols, y, x):
self.window = newwin(rows, cols, y, x)
self.panel = new_panel(self.window)
self.text = []
def addstr(self, y, x, text):
self.text.append((y, x, text))
def toggle_visibility(self):
if self.panel.hidden():
self.panel.show()
else:
self.panel.hide()
self.window.refresh()
update_panels()
def main(stdscr):
yedit = Editor(stdscr)
while yedit.input_handler():
continue
wrapper(main)
问题:
当按下 'm' 键时,它会切换面板的可见性,但是在第一次按下 'm.' 时绝对没有任何反应。包含 print(ch)
语句来测试它。我省略了用于验证 ch
不是意外值的最终 else
语句。相反,按 'q' 会在第一次按键时按预期退出程序。
这是怎么回事?
您的代码中到处都是刷新。我不确定第一次按键不起作用的确切原因,但是如果您在事件循环中的单个位置处理刷新,例如...
def input_handler(self):
self.screen.refresh()
ch = self.screen.getch()
...
并删除对 "refresh" 的其他调用,隐藏功能正常运行