Python curses中断终端输出

问题描述 投票:0回答:2

我正在使用Python创建curses终端GUI,但是首先启动脚本并停止脚本,终端输出完全损坏。在上一行的长度之后打印每行新内容。

例如:

self.player_screen()                                                                                                                                                                                                                                                                                          │
│                                   File "main.py", line 76, in player_screen                                                                                                                                                                                                                                            │
│                                                                                   for player_state in player:                                                                                                                                                                                                             │
│                                                                                                                File "/home/jerome/PycharmProjects/project/main.py", line 40, in current_play                                                                                                                            │
│                                                                                                                                                                                                   sleep(1)                                                                                                                │
│                                                                                                                                                                                                           KeyboardInterrupt

我不知道为什么终端输出损坏以及如何解决此问题。我使用Python curses包,就像文档说的那样:

def login_screen(self):
    login_title = "Please login using your username/id:\n"
    login_screen = newwin(0, 0)
    login_screen.box()
    v_dim, h_dim = login_screen.getmaxyx()

    login_screen.addstr(round(v_dim / 2), round((h_dim - len(login_title)) / 2), login_title)

    username_input = login_screen.subwin(1, 44, round(v_dim / 2 + 1), round((h_dim - 44) / 2))
    username_text_input = textpad.Textbox(username_input)
    username_input.refresh()

    login_screen.addstr(v_dim - 1, h_dim - 20, "[Enter]Submit")
    login_screen.refresh()

    username = username_text_input.edit()

    endwin()

我没有在我的代码中发现任何错误,也没有什么对我的文档有所帮助。

有人已经解决了这个问题吗?

python python-3.x curses python-curses
2个回答
0
投票

您的程序似乎正在引发异常。

将您的curses代码包装在try/catch中,可以退出。例如:

try:
    [your curses code here]
except:
    curses.nocbreak()
    stdscr.keypad(0)
    curses.echo()
    curses.endwin()
    raise

最后一个raise应该照常在控制台中打印异常。

我编写了一个实用程序模块,它为我执行此操作,它是there


0
投票

考虑使用curses wrapper()包装代码。

来自文档:

调试curses应用程序时的一个常见问题是,当应用程序死机时,您的终端会混乱,而没有将终端恢复到以前的状态。在Python中,这种情况通常发生在您的代码有错误并引发未捕获的异常时。例如,当您键入按键时,它们不再在屏幕上回显,这使得使用外壳变得很困难。

在Python中,您可以通过导入curses.wrapper()函数并像这样使用它来避免这些复杂性并使调试变得更加容易:

from curses import wrapper

def main(stdscr):
    # Clear screen
    stdscr.clear()

    #Insert your code here

wrapper(main)
© www.soinside.com 2019 - 2024. All rights reserved.