Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python/Curses:第一次按键时不会发生任何事情_Python_Curses - Fatal编程技术网

Python/Curses:第一次按键时不会发生任何事情

Python/Curses:第一次按键时不会发生任何事情,python,curses,Python,Curses,守则: 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

守则:

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)
语句用于测试这一点。我省略了最后一个
else
语句,该语句用于验证
ch
不是意外值。相反,按“q”键会在第一次按键时按预期退出程序


发生了什么事?

代码中到处都是刷新内容。我不知道为什么第一次按键不起作用,但是如果你在事件循环中的一个位置处理刷新,比如

def input_handler(self):
    self.screen.refresh()
    ch = self.screen.getch()
    ...

如果删除对“刷新”的其他调用,则隐藏功能将正常运行

我将添加一个“elif print(error)”。事实上,如果“m”以某种方式损坏,它将无法打印,您也不知道原因。对不起,我应该读最后一行。我的错。这是多余的,因为getch做了一个刷新是的-也许是这样。我摆弄它来学习一点关于诅咒的知识,但我不明白为什么这种改变奏效了哈哈。