【问题标题】:how to enable mouse movement events in python-curses如何在 python-curses 中启用鼠标移动事件
【发布时间】:2019-05-25 10:30:11
【问题描述】:

我想用 python-curses 检测鼠标移动事件。我不知道如何启用这些事件。我尝试如下启用所有鼠标事件:

stdscr = curses.initscr()
curses.mousemask(curses.REPORT_MOUSE_POSITION | curses.ALL_MOUSE_EVENTS)
while True:
    c = stdscr.getch()
    if c == curses.KEY_MOUSE:
        id, x, y, z, bstate = curses.getmouse()
        stdscr.addstr(curses.LINES-2, 0, "x: " + str(x))
        stdscr.addstr(curses.LINES-1, 0, "y: " + str(y))
        stdscr.refresh()
    if c == ord('q'):
        break
 curses.endwin()

我只在单击、按下鼠标按钮等时获得鼠标事件,但没有鼠标移动事件。如何启用这些事件?

【问题讨论】:

    标签: python python-3.x python-curses


    【解决方案1】:

    我通过更改我的 $TERM env var / terminfo 让它工作。在 Ubuntu 上,只需设置 TERM=screen-256color 即可工作,但在 OSX 上,我必须使用此处的说明编辑 terminfo 文件:

    Which $TERM to use to have both 256 colors and mouse move events in python curses?

    但对我来说格式不同,所以我添加了以下行:

    XM=\E[?1003%?%p1%{1}%=%th%el%;,

    为了测试它,我使用了这个 Python 代码(注意 screen.keypad(1) 是非常必要的,否则鼠标事件会导致 getch 返回转义键代码)。

    import curses
    
    screen = curses.initscr()
    screen.keypad(1)
    curses.curs_set(0)
    curses.mousemask(curses.ALL_MOUSE_EVENTS | curses.REPORT_MOUSE_POSITION)
    curses.flushinp()
    curses.noecho()
    screen.clear()
    
    while True:
        key = screen.getch()
        screen.clear()
        screen.addstr(0, 0, 'key: {}'.format(key))
        if key == curses.KEY_MOUSE:
            _, x, y, _, button = curses.getmouse()
            screen.addstr(1, 0, 'x, y, button = {}, {}, {}'.format(x, y, button))
        elif key == 27:
            break
    
    curses.endwin()
    curses.flushinp()
    

    【讨论】:

    • 如果您没有获得所需的确切鼠标位置报告行为,我发布了follow-up answer to the answer you referenced。我包括了找到令人满意的XM 字符串的步骤。我使用提供的字符串时遇到的问题是鼠标位置报告一直在进行——即使没有按下鼠标按钮。这可能对“悬停”功能有好处。但是我没有在我的应用程序中实现悬停,并且浪费了不断的报告。我只需要一个“鼠标拖动”功能。
    • 在我的 Ubuntu 20 系统上设置 curses.keypad(True) 是不必要的。
    猜你喜欢
    • 2019-10-11
    • 1970-01-01
    • 1970-01-01
    • 2013-04-22
    • 1970-01-01
    • 2023-03-19
    • 2016-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多