2011-12-30 54 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通過包裝上述兩種解決方案以跨平臺的方式用於控制檯。