【问题标题】:Python: calling 'curses' twice stuffs up my terminalPython:调用'curses'两次塞满我的终端
【发布时间】:2012-05-25 14:03:16
【问题描述】:

我在终端游戏(Mac OSX,Python 2.6.5)中使用curses 解谜。这个谜题涉及旋转一些表盘来打开锁。我的代码,有点简化(请原谅丑陋):

import curses

dial = ["| -1  |","|-1/3 |","|  0  |","| 1/2 |","| 2/3 |","|  1  |"]

clear = "       "
pointer = "   ^   "
subdials = [clear,clear]

d = {'d0':{},'d1':{}}
d['d0'] = {'val':2,'disp':dial[2]}
d['d1'] = {'val':2,'disp':dial[2]}

def spin(scr):
    try:
        curses.curs_set(0)
    except:
        pass

    solved = 0
    p = 0
    subdials[p] = pointer
    dials = [d['d0']['disp'],d['d1']['disp']]

    maxy,maxx = scr.getmaxyx()

    newscr = scr.subwin(10,51,maxy-15,0)
    newscr.box(ord('|'),ord('-'))
    newscr.addstr(4,8,''.join(dials))
    newscr.addstr(6,8,''.join(subdials))
    newscr.refresh()

    while solved == 0:
        r = scr.getch()
        subdials[p] = clear
        currd = 'd'+str(p)

        if r == ord('q') or r == ord('Q'):
            break
        elif r == curses.KEY_LEFT:
            if p > 0 and p < 2:
                p -= 1
            else: pass
        elif r == curses.KEY_RIGHT:
            if p >= 0 and p < 1:
                p += 1
            else: pass
        elif r == curses.KEY_UP:
            if d[currd]['val'] >= 0 and d[currd]['val'] < 5:
                d[currd]['val'] += 1
                d[currd]['disp'] = dial[d[currd]['val']]
            else: pass
        elif r == curses.KEY_DOWN:
            if d[currd]['val'] > 0 and d[currd]['val'] <= 5:
                d[currd]['val'] -= 1
                d[currd]['disp'] = dial[d[currd]['val']]
            else: pass
        else: pass

        subdials[p] = pointer
        dials = [d['d0']['disp'],d['d1']['disp']]

        newscr.addstr(4,8,''.join(dials))
        newscr.addstr(6,8,''.join(subdials))
        newscr.refresh()

        if d['d0']['val'] == 5 and d['d1']['val'] == 3:
            solved = 1

    if solved == 0:
        scr.addstr(maxy-1,0,"You can't figure out the lock.")
    else:
        scr.addstr(maxy-1,0,"The lock is open!")
    scr.getch()
    scr.clear()
    return solved

def box():
    solved = curses.wrapper(spin)
    return solved

有两种方法可以退出'box'功能:按'q'退出,或者通过解谜。第一次退出诅咒(无论哪种方式)都没有问题。但是如果我再次调用'box',很快就会出现问题。

首先,在curses 窗口中,我的函数被指示到pass 的任何键输入都会回显到屏幕上。其次,更糟糕的是,当你第二次退出谜题时——无论是退出还是获胜——noechocbreak 并没有关闭,所以我的终端被塞满了,必须重新设置。

(注意:如果我继续调用“box”,则在 curses 窗口本身中不再回显按键输入,但我的终端不会恢复正常。)

我终其一生都无法弄清楚导致这种行为的原因。救命!

【问题讨论】:

  • 你好,Nrvous。我尝试在我的控制台中运行你的游戏,它直接退出,例如python curses.py 立即终止。你是如何运行它的?其次,您可以尝试使用 cProfile 模块运行您的代码,以查看是否有任何过多的函数调用 - python -m cProfile curses.py。这可能表示无限循环。
  • @Aaron Newton - 感谢您的回复。我运行 python 解释器,从脚本中导入所有内容,然后调用 box 函数。从长远来看,这就是我打算做的——从我的主游戏脚本中调用该函数,而不是独立运行这个脚本。我尝试在这个脚本中添加一行调用box(),然后使用 cProfile 运行它——它似乎没有出现任何不愉快的地方。
  • 感谢您澄清这一点。我尝试了以下操作:&gt;&gt;&gt; import curses_prog as game &gt;&gt;&gt; run = game.box &gt;&gt;&gt; run &lt;function box at 0x00000000022ABC18&gt; &gt;&gt;&gt; run() Traceback (most recent call last): File "&lt;stdin&gt;", line 1, in &lt;module&gt; File "curses_prog.py", line 78, in box solved = curses.wrapper(spin) AttributeError: 'module' object has no attribute 'wrapper'(对此处的格式感到抱歉)。这可能只是我对 Python 的无知或我的实现,但我无法让它运行。
  • 我觉得第二行应该是run = game.box(),带括号?这样能解决吗?
  • 无论如何,这段代码在 FreeBSD (Python 2.7) 上对我来说很好用。确实闻起来像 OSX 端口中的错误。

标签: python terminal curses


【解决方案1】:

我将 Python 更新到 2.7.3,问题就消失了。呵呵!

【讨论】:

    猜你喜欢
    • 2011-07-06
    • 2018-04-25
    • 1970-01-01
    • 2011-06-14
    • 2012-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-15
    相关资源
    最近更新 更多