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

如何在 curses 中启用鼠标移动事件?

我找到了Mouse movement events in NCursesXterm Control Sequencesncurses_mouse_movement,但我不明白如何在 python-curses 中启用鼠标移动事件。我认为它与 TERM=xterm-1003 有关,但我不知道如何在 python-curses 中设置它。

这是我为启用任何鼠标事件所做的:

curses.mousemask(curses.REPORT_MOUSE_POSITION | curses.ALL_MOUSE_EVENTS)

【问题讨论】:

标签: python python-curses


【解决方案1】:

我知道这是一个相当老的问题,OP 可能不再需要它了,但我将把它留给那些在经过数小时的谷歌搜索和挠头后偶然发现这个问题的人:

import curses

def main(win:curses.window):
    win.clear()
    win.nodelay(True)
    curses.mousemask(curses.REPORT_MOUSE_POSITION)
    print('\033[?1003h') # enable mouse tracking with the XTERM API
    # https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-Mouse-Tracking

    while True:
        ch=win.getch()
        if ch==curses.KEY_MOUSE:
            win.clear()
            win.addstr(0,0,str(curses.getmouse()[1:3]))
            win.refresh()

curses.wrapper(main)

这里最重要的一行是print('\033[?1003h'),它允许向程序报告鼠标位置,而mousemask 允许curses 解释来自终端的输入。请注意,print 必须出现在调用 mousemask() 之后。

在 macOS 10.14.6 上使用 iTerm2 进行测试。 terminfo 没有任何调整。

【讨论】:

    【解决方案2】:

    我终于让它工作了。在 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%;,

    到我的terminfo。为了测试它,我使用了这个 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()
    

    【讨论】:

    • 有什么办法让它在 Windows 控制台上工作? Python 的curses 仅在按下或释放鼠标而不是移动鼠标时报告我的 Windows 上的鼠标事件。 Windows上有类似的终端设置方法吗?
    • 我可以通过在masm中调用winapi的ReadConsoleInput来获取鼠标的位置。所以也许我可以使用ctypes 来做到这一点。但它会很脏......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-22
    • 1970-01-01
    • 2023-03-19
    • 2016-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多