代码之家  ›  专栏  ›  技术社区  ›  user1476056

蟒蛇诅咒中的鼠标滚轮

  •  4
  • user1476056  · 技术社区  · 13 年前

    有人知道是否可以在诅咒中处理鼠标滚轮的移动吗?我想它们应该和箭头键一样。举个例子不胜感激。

    非常感谢。

    1 回复  |  直到 11 年前
        1
  •  5
  •   senderle    13 年前

    我想这取决于系统和终端。我写了以下内容——它只是捕捉鼠标状态并将其打印到屏幕上。我能够使用xterm在Mac OSX中接收鼠标滚动事件。(向上滚动对我来说注册为按钮4;向下滚动为按钮2——但使用本机终端应用程序无法工作。)

    如果您仔细查看此代码,就会清楚地看到,您必须使用 scr.getch() 首先,测试它是否返回 curses.KEY_MOUSE 。如果是,您可以拨打 curses.getmouse() ,返回一个包含设备id、坐标和状态标志的元组。

    import curses
    from contextlib import contextmanager
    
    @contextmanager
    def open_screen():
        scr = curses.initscr()
        curses.noecho()
        curses.cbreak()
        scr.keypad(1)
        try:
            yield scr
        finally:
            curses.nocbreak()
            scr.keypad(0)
            curses.echo()
            curses.endwin()
    
    curses_mouse_states = {
        curses.BUTTON1_PRESSED: 'Button 1 Pressed', 
        curses.BUTTON1_RELEASED: 'Button 1 Released', 
        curses.BUTTON1_CLICKED: 'Button 1 Clicked',
        curses.BUTTON1_DOUBLE_CLICKED: 'Button 1 Double-Clicked',
        curses.BUTTON1_TRIPLE_CLICKED: 'Button 1 Triple-Clicked',
    
        curses.BUTTON2_PRESSED: 'Button 2 Pressed', 
        curses.BUTTON2_RELEASED: 'Button 2 Released', 
        curses.BUTTON2_CLICKED: 'Button 2 Clicked',
        curses.BUTTON2_DOUBLE_CLICKED: 'Button 2 Double-Clicked',
        curses.BUTTON2_TRIPLE_CLICKED: 'Button 2 Triple-Clicked',
    
        curses.BUTTON3_PRESSED: 'Button 3 Pressed', 
        curses.BUTTON3_RELEASED: 'Button 3 Released', 
        curses.BUTTON3_CLICKED: 'Button 3 Clicked',
        curses.BUTTON3_DOUBLE_CLICKED: 'Button 3 Double-Clicked',
        curses.BUTTON3_TRIPLE_CLICKED: 'Button 3 Triple-Clicked',
    
        curses.BUTTON4_PRESSED: 'Button 4 Pressed', 
        curses.BUTTON4_RELEASED: 'Button 4 Released', 
        curses.BUTTON4_CLICKED: 'Button 4 Clicked',
        curses.BUTTON4_DOUBLE_CLICKED: 'Button 4 Double-Clicked',
        curses.BUTTON4_TRIPLE_CLICKED: 'Button 4 Triple-Clicked',
    
        curses.BUTTON_SHIFT: 'Button Shift', 
        curses.BUTTON_CTRL: 'Button Ctrl', 
        curses.BUTTON_ALT: 'Button Alt'
    }
    
    with open_screen() as scr:
        curses.mousemask(-1)
        while True:
            c = scr.getch()
            if c == curses.KEY_MOUSE:
                mouse_state = curses.getmouse()[4]
                states = '; '.join(state_string for state, state_string 
                                   in curses_mouse_states.viewitems() 
                                   if mouse_state & state)
                scr.addstr(0, 0, states)
                scr.clrtoeol()
                scr.refresh()
            elif c == ord('q'):
                break
    
    推荐文章