当我运行以下示例代码并按下"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中创建滚动菜单吗?我有一个记录列表,我从sqlite3中的查询得到,我必须在一个框中显示它们但它们超过最大行数:我可以制作一个小菜单来显示它们而不会使诅咒崩溃吗?
我正在使用Python的curses模块。在stdscr中,每当我按Enter键时,诅咒就会移到同一行的第一列。我对此有几个问题。
如果我想在Enter键上执行某些操作(执行某些功能或执行某些操作),那么在“如果”条件下会发生什么?例如
if (condition which will determine if ENTER was pressed or not)
somecode
Run Code Online (Sandbox Code Playgroud)使用 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) 我不能使用\xe2\x96\x88字符来诅咒边界。
代码示例:
\nimport curses\n\nstdscr = curses.initscr()\nc = \'\xe2\x96\x88\'\nstdscr.border(c, c, c, c, c, c, c, c)\nstdscr.getch()\nRun Code Online (Sandbox Code Playgroud)\n我收到此错误:
\n\n\n溢出错误:字节不适合 chtype
\n
不过我可以用来addstr写一些 utf-8 字符,如下所示:
stdscr.addstr(0, 0, "\xe2\x96\x88")\nRun Code Online (Sandbox Code Playgroud)\n感谢您的帮助。
\n在宣布一个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)
为什么我不能写到右下角的单元格?
我在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 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来这样做(只是为了测试终端是否能够显示颜色)。
当前,如果我将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()== …
代码是:
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-curses ×10
python ×9
curses ×6
ncurses ×5
python-3.x ×5
python-2.7 ×2
terminal ×1
ubuntu-18.04 ×1
xterm ×1