标签: python-curses

Python3 + Curses:如何立即按"q"结束程序?

当我运行以下示例代码并按下"q"时,它将正确结束,但如果我按下任何其他字符"例如许多休息和许多其他字符"然后按"q"它将不会退出,我该怎么解决这个问题?

import curses, time

def main(sc):
    sc.nodelay(1)

    while True:
        sc.addstr(1, 1, time.strftime("%H:%M:%S"))
        sc.refresh()

        if sc.getch() == ord('q'):
            break

        time.sleep(1)

if __name__=='__main__': curses.wrapper(main)
Run Code Online (Sandbox Code Playgroud)

python curses ncurses python-3.x python-curses

4
推荐指数
1
解决办法
1596
查看次数

如何在python-curses中创建滚动菜单

有一种方法可以在python-curses中创建滚动菜单吗?我有一个记录列表,我从sqlite3中的查询得到,我必须在一个框中显示它们但它们超过最大行数:我可以制作一个小菜单来显示它们而不会使诅咒崩溃吗?

python curses terminal python-curses

4
推荐指数
1
解决办法
4889
查看次数

解释stdscr中的“ ENTER”按键(Python中的curses模块)

我正在使用Python的curses模块。在stdscr中,每当我按Enter键时,诅咒就会移到同一行的第一列。我对此有几个问题。

  1. 是什么原因呢?
  2. 有办法将诅咒移到下一行吗?
  3. 如果我想在Enter键上执行某些操作(执行某些功能或执行某些操作),那么在“如果”条件下会发生什么?例如

    if (condition which will determine if ENTER was pressed or not)
        somecode
    
    Run Code Online (Sandbox Code Playgroud)

python curses python-2.7 python-3.x python-curses

4
推荐指数
1
解决办法
5726
查看次数

_curses.error: addstr() 返回错误

使用 Python,我正在尝试编写一个脚本,每当您按下空格键时,该脚本都会将所有键入的字符转换为 'a'。例如,我输入“python”然后输入空格,然后“python”将转换为“aaaaaa”。

import argparse
import curses
import time

# Main Function
def main():
    screen=curses.initscr()
    curses.cbreak()
    screen.keypad(1)
    curses.echo()
    str_txt=''
    count = 0
    while True:
        s=screen.getch()
        if s != ord(' ') and s != ord('\x1b') and s != curses.KEY_BACKSPACE and s != curses.KEY_ENTER:
            str_txt += chr(int(s))
            count+=1

        if s == ord(' '):
            dim = screen.getyx()
            h = 'a'*len(str_txt)+' '
            screen.addstr(dim[0],dim[1]-count-1, h)     
            count=0
            str_txt=''
            screen.refresh()

        if s == curses.KEY_ENTER or s==10 or s==13:
            dim = screen.getyx()
            screen.move(dim[0]+1,0)
            screen.refresh()

        #if s == curses.KEY_BACKSPACE: …
Run Code Online (Sandbox Code Playgroud)

python curses python-2.7 python-3.x python-curses

4
推荐指数
1
解决办法
1万
查看次数

使用 utf-8 字符作为诅咒边框

我不能使用\xe2\x96\x88字符来诅咒边界。

\n

代码示例:

\n
import curses\n\nstdscr = curses.initscr()\nc = \'\xe2\x96\x88\'\nstdscr.border(c, c, c, c, c, c, c, c)\nstdscr.getch()\n
Run Code Online (Sandbox Code Playgroud)\n

我收到此错误:

\n
\n

溢出错误:字节不适合 chtype

\n
\n

不过我可以用来addstr写一些 utf-8 字符,如下所示:

\n
stdscr.addstr(0, 0, "\xe2\x96\x88")\n
Run Code Online (Sandbox Code Playgroud)\n

感谢您的帮助。

\n

python gnome-terminal python-3.x python-curses ubuntu-18.04

4
推荐指数
1
解决办法
2039
查看次数

当addtr为9,9时,ncurses 10,10 pad会导致错误

在宣布一个10×10的垫后,我显然无法写入右下角,9,9没有错误.这里发生了什么?

import curses

def start(stdscr):
    curses.curs_set(0)
    movement = curses.newpad(10, 10)

    movement.addstr(8, 9, '+')
    movement.addstr(9, 8, '+') 
    movement.addstr(9, 9, '+') #This line causes an error

if __name__ == '__main__':
    curses.wrapper(start)
Run Code Online (Sandbox Code Playgroud)

原因:

  File "curses_movement_testing.py", line 35, in <module>
    curses.wrapper(start)
  File "/usr/lib64/python2.6/curses/wrapper.py", line 43, in wrapper
    return func(stdscr, *args, **kwds)
  File "curses_movement_testing.py", line 10, in start
    movement.addstr(9, 9, '+')
_curses.error: addstr() returned ERR
Run Code Online (Sandbox Code Playgroud)

为什么我不能写到右下角的单元格?

python ncurses python-curses

3
推荐指数
1
解决办法
1730
查看次数

如何在 python-curses 中填充右下角

我在Python3.3中使用curses,需要用字符填充整个可用空间。当我的双 for 循环到达最后一个角落时,就会出现错误。

Traceback (most recent call last):
  File "main.py", line 14, in <module>
    curses.wrapper(main)
  File "/usr/local/lib/python3.3/curses/__init__.py", line 94, in wrapper
    return func(stdscr, *args, **kwds)
  File "main.py", line 9, in main
    stdscr.addch(y, x, ord('.'))
_curses.error: addch() returned ERR
Run Code Online (Sandbox Code Playgroud)

我注意到每次添加字符时,光标都会向右移动。我没有像我可能的那样彻底测试这一点,但我怀疑光标在最后一次调用 stdscr.addch 时离开了窗口末尾,这可能会导致错误。

附加说明是,通过使用窗口返回的最大宽度或高度一个单位,我可以循环而不会出现错误。

失败的来源:

import curses

def main(stdscr):
    height, width = stdscr.getmaxyx()
    for y in range(height):
        for x in range(width):
            stdscr.addch(y, x, ord('.'))
    stdscr.refresh()
    stdscr.getch()

if __name__ == '__main__':
    curses.wrapper(main)
Run Code Online (Sandbox Code Playgroud)

对于我的项目,使用完整的矩形非常重要。到目前为止,我已经将最大宽度从 80 缩短到 79,但如果有人知道如何写入最后一个角,我很想听听。

python-3.x python-curses

3
推荐指数
1
解决办法
1592
查看次数

Python 诅咒不显示颜色,而 C ncurses 工作正常

我似乎无法让 Python curses 模块显示颜色,而 ncurses C 库工作正常。这是一个应该可以工作的简单脚本:

import curses

def main(stdscr):

  if not curses.has_colors(): raise
  stdscr.addstr("Hello world\n", curses.color_pair(curses.COLOR_RED))
  stdscr.addstr("Press any key to exit.\n")
  stdscr.refresh()
  while stdscr.getch() == -1: pass

if __name__ == '__main__':
  curses.wrapper(main)
Run Code Online (Sandbox Code Playgroud)

我只能看到“按任意键退出。”。我知道“Hello world”是因为换行而写的,但我看不到文本。我尝试了各种颜色对,但只有 0,即白色,有效。

不使用包装器,即

  stdscr = curses.initscr()
  curses.start_color()
  main(stdscr)
  curses.endwin()
Run Code Online (Sandbox Code Playgroud)

没有帮助。

我在具有黑色背景的 XTerm(312) 和具有白色背景的 urxvt v9.20 上对其进行了测试。我在 Debian jessie 上,使用 bash 和 Python 2.7。

我运行了一个使用 ncurses 的旧 C 脚本,它可以很好地显示颜色,所以我假设我做错了什么,或者 python 库有问题。我下载了一个名为 colortest-python 的包,它也能够显示颜色,尽管它不使用curses来这样做(只是为了测试终端是否能够显示颜色)。

python curses ncurses python-curses

3
推荐指数
1
解决办法
810
查看次数

在python curses中使用哪个$ TERM同时具有256色和鼠标移动事件?

当前,如果我将TERM环境变量设置为'xterm-1003',则可以获取鼠标移动事件,但是会得到cr脚的颜色和诅咒.can_change_color()== False

os.environ['TERM'] = 'xterm-1003'
...
curses.mousemask(curses.ALL_MOUSE_EVENTS | curses.REPORT_MOUSE_POSITION)
...
while True:
    event = screen.getch()
    if event == curses.KEY_MOUSE:
        # I get nice events whenever I move the mouse (no click required)
        _, mx, my, _, _ = curses.getmouse()
Run Code Online (Sandbox Code Playgroud)

如果我将TERM env var设置为'xterm-256color',我会得到一个漂亮的调色板以及curses.can_change_color()== True,但是除非单击按钮,否则我不会收到鼠标事件!

>ls /usr/share/terminfo/x/ 
Run Code Online (Sandbox Code Playgroud)

报告

xfce           xterm-256color  xterm-hp      xterm-r5     xterm-xf86-v32   xterm-xfree86
xterm          xterm-88color   xterm-new     xterm-r6     xterm-xf86-v33   xterm-xi
xterm-1002     xterm-8bit      xterm-nic     xterm-sco    xterm-xf86-v333  xterms
xterm-1003     xterm-basic     xterm-noapp   xterm-sun    xterm-xf86-v40
xterm-16color  xterm-bold      xterm-old     xterm-vt220  xterm-xf86-v43
xterm-24       xterm-color     xterm-pcolor  xterm-vt52   xterm-xf86-v44
Run Code Online (Sandbox Code Playgroud)

我尝试过的所有方法似乎都不支持curses.can_change_color()== …

python curses ncurses xterm python-curses

3
推荐指数
1
解决办法
803
查看次数

_curses.error: addwstr() 在 newwin 方法上将 nlines 更改为 1 时返回 ERR

代码是:

from curses import *
from curses.panel import *

def main(stdscr):
    start_color()
    curs_set(0)
    init_pair(1, COLOR_BLACK, COLOR_CYAN)

    posy = posx = 0
    window = newwin(1, 1, posy, posx)
    panel = new_panel(window)
    window.addstr('*', color_pair(1))
    update_panels()
    doupdate()

    while True:
        key = stdscr.getch()

        if key == ord('j'):
            posy+=1
        elif key == ord('k'):
            posy-=1
        elif key == ord('h'):
            posx-=1
        elif key == ord('l'):
            posx+=1
        elif key == ord('q'):
            endwin()
            break
        panel.move(posy,posx)
        update_panels()
        doupdate()
if __name__ == '__main__':
    wrapper(main)
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

Traceback (most recent call last):
  File …
Run Code Online (Sandbox Code Playgroud)

python ncurses python-curses

3
推荐指数
1
解决办法
5723
查看次数