2011-12-30 110 views
0

是否有某种方式让python中的控制台窗口上的鼠标按下?我知道你可以这样做,因为如果你正在运行Windows,你可以打开cmd并输入“edit”。你将如何在Python中做这个例子?谢谢。在python的控制台窗口上获取鼠标按下

+0

请参阅[this](http://stackoverflow.com/questions/6285270/how-can-i-get-the-mouse-position-in-a-console-program)SO问题和答案。你可能不得不在C中创建一个模块,因为我怀疑标准Python为此提供了一个本地模块。 – 2011-12-30 08:55:15

回答

0

是的,但这是相当数量的工作。

http://sourceforge.net/projects/pywin32/files/

它的工作原理就像从C代码谈话的Win32API的。

如果您在Google上使用MSDN上的函数名称,Microsoft文档相当不错。

pywin32包括一个称为win32console_demo.py

添加以下行,以使鼠标输入文件。刚刚创建了conin之后。

conin.SetConsoleMode(ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT) 

win32console_demo.py编辑启用鼠标输入。

import win32con 
import win32file 
from win32console import * 
import traceback, time 


virtual_keys={} 
for k,v in win32con.__dict__.items(): 
    if k.startswith('VK_'): 
     virtual_keys[v]=k 

free_console=True 
try: 
    AllocConsole() 
except error, exc: 
    if exc.winerror!=5: 
     raise 
    ## only free console if one was created successfully 
    free_console=False 

stdout=GetStdHandle(STD_OUTPUT_HANDLE) 

conin=PyConsoleScreenBufferType(win32file.CreateFile("CONIN$", win32con.GENERIC_READ|win32con.GENERIC_WRITE, win32con.FILE_SHARE_READ, None, win32con.OPEN_EXISTING, 0, 0)) 

conin.SetConsoleMode(ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT) 

newbuffer=CreateConsoleScreenBuffer() 
newbuffer.SetConsoleActiveScreenBuffer() 
newbuffer.SetConsoleTextAttribute(FOREGROUND_RED|FOREGROUND_INTENSITY 
     |BACKGROUND_GREEN|BACKGROUND_INTENSITY) 
newbuffer.WriteConsole('This is a new screen buffer\n') 

newbuffer.SetConsoleTextAttribute(FOREGROUND_RED|FOREGROUND_INTENSITY 
     |BACKGROUND_GREEN|BACKGROUND_INTENSITY) 
newbuffer.WriteConsole('Press some keys, click some characters with the mouse\n') 

newbuffer.SetConsoleTextAttribute(FOREGROUND_BLUE|FOREGROUND_INTENSITY 
     |BACKGROUND_RED|BACKGROUND_INTENSITY) 
newbuffer.WriteConsole('Hit "Esc" key to quit\n') 


breakout=False 
while not breakout: 
    input_records=conin.ReadConsoleInput(10) 
    for input_record in input_records: 
     if input_record.EventType==KEY_EVENT: 
      if input_record.KeyDown: 
       if input_record.Char=='\0': 
        newbuffer.WriteConsole(virtual_keys.get(input_record.VirtualKeyCode, 'VirtualKeyCode: %s' %input_record.VirtualKeyCode)) 
       else: 
        newbuffer.WriteConsole(input_record.Char) 
       if input_record.VirtualKeyCode==win32con.VK_ESCAPE: 
        breakout=True 
        break 
     elif input_record.EventType==MOUSE_EVENT: 
      if input_record.EventFlags==0: ## 0 indicates a button event 
       if input_record.ButtonState!=0: ## exclude button releases 
        pos=input_record.MousePosition 
        # switch the foreground and background colors of the character that was clicked 
        attr=newbuffer.ReadConsoleOutputAttribute(Length=1, ReadCoord=pos)[0] 
        new_attr=attr 
        if attr&FOREGROUND_BLUE: 
         new_attr=(new_attr&~FOREGROUND_BLUE)|BACKGROUND_BLUE 
        if attr&FOREGROUND_RED: 
         new_attr=(new_attr&~FOREGROUND_RED)|BACKGROUND_RED 
        if attr&FOREGROUND_GREEN: 
         new_attr=(new_attr&~FOREGROUND_GREEN)|BACKGROUND_GREEN 

        if attr&BACKGROUND_BLUE: 
         new_attr=(new_attr&~BACKGROUND_BLUE)|FOREGROUND_BLUE 
        if attr&BACKGROUND_RED: 
         new_attr=(new_attr&~BACKGROUND_RED)|FOREGROUND_RED 
        if attr&BACKGROUND_GREEN: 
         new_attr=(new_attr&~BACKGROUND_GREEN)|FOREGROUND_GREEN 
        newbuffer.WriteConsoleOutputAttribute((new_attr,),pos) 
     else: 
      newbuffer.WriteConsole(str(input_record)) 
    time.sleep(0.1) 

newbuffer.Close() 

if free_console: 
    FreeConsole() 
1

我个人不从一个事实,即它只能在第一时间它是进口的最后答案喜欢PyWin32,事后也无法导入它的主要PYD模块。
然后就是它不是跨平台的。

诅咒是一个更好的选择,尽管它不是python27正好友好,但我设法得到它在葡萄酒的工作:

import _curses # _curses.pyd supplied locally for python27 win32 
import curses 

screen = curses.initscr() 
#curses.noecho() 
curses.curs_set(0) 
screen.keypad(1) 
curses.mousemask(curses.ALL_MOUSE_EVENTS) 

screen.addstr("This is a Sample Curses Script\n\n") 

key=0 
while key!=27: # Esc to close 
    key = screen.getch() 
    #screen.erase() 
    if key == curses.KEY_MOUSE: 
     _, mx, my, _, _ = curses.getmouse() 
     y, x = screen.getyx() 
     screen.addstr('mx, my = %i,%i    \r'%(mx,my)) 
    screen.refresh() 

curses.endwin() 

在这个例子中,你需要点击,拖动和释放要注册的事件,但我认为这有一个办法。

我刚刚玩这个我自己(我并不想与PyQt的或PyGLFW所有复杂)

编辑:
设法得到它按预期工作和更新的代码。 您不需要再拖动该活动进行注册。

1

前面的答案都是正确的:您可以在Windows上使用pywin32或在Linux上使用curses来处理鼠标输入。不过,它们都不适用于其他平台。

如果你想要处理两者或只是一个更简单的API的东西,你可以使用我最近写的一个包 - asciimatics。 Screen类handles mouse input通过包装上述两种解决方案以跨平台的方式用于控制台。