2015-09-25 24 views
8

Tôi đang viết chương trình kết nối với phần mềm thiết kế, như một plugin bên ngoài, sau đó theo dõi chuyển động của chuột và các sự kiện. Nó sẽ thực hiện các hành động dựa trên trạng thái của các sự kiện chuột phần mềm được kết nối.Nhận các sự kiện chuột bên ngoài cửa sổ Tkinter bằng Python

Ý tưởng là ứng dụng bên ngoài sẽ có khả năng giao tiếp với nhiều chương trình tương tự thay vì chương trình bổ trợ cụ thể.

Nguyên mẫu và phần mềm sản xuất tiềm năng, được viết bằng python sử dụng thư viện GUI Tkinter. Nỗ lực là làm cho nó đơn giản và di động.

Tôi đã dễ dàng có thể lấy vị trí chuột cấp "OS" (màn hình đúng X, Y) mà không cần cửa sổ Tkinter cần phải hoạt động. Vấn đề của tôi là tôi không tìm cách dễ dàng nhận các sự kiện click chuột từ Tkinter. Tôi chỉ có thể tập hợp các sự kiện khi trên cửa sổ Tkinter đang hoạt động.

Tkinter cung cấp này cho vị trí chuột:

coord = self.gui.winfo_pointerxy() 

tôi không thể tìm thấy tương tự cho các sự kiện chuột. Có các thư viện như selfspyPymouse (bây giờ là một phần của PyUserInput) giám sát các sự kiện, nhưng chủ yếu là để kiểm soát các thiết bị đầu vào. Ý tưởng sao lưu của tôi là sử dụng các thư viện này để tham khảo về cách viết chương trình giám sát đầu vào của riêng tôi.

Hai nền tảng chính của tôi là Mac và Windows.

câu chuyện dài ngắn:

  • thể Tkinter cho tôi sự kiện chuột khi những sự kiện nằm ngoài cửa sổ Tkinter.
  • Nếu không, có các tùy chọn khác "ngoài hộp" có thể cho tôi các sự kiện chuột X, Y và chuột không.
  • Nếu không có giải pháp nào trong số các giải pháp hộp, một số đề xuất về cách tiếp cận và API. (Trông giống như win32api cho các cửa sổ, thạch anh và/hoặc Cocoa trong Mac và Xlib trong Linux)

Cảm ơn thời gian của bạn

Trả lời

1

Bằng cách này bạn có được vị trí chuột với Tkinter.

import Tkinter as tk 
root = tk.Tk() 

def motion(event): 
    x, y = event.x, event.y 
    print('{}, {}'.format(x, y)) 

root.bind('<Motion>', motion) 
root.mainloop() 

Có một cross-platform mô-đun pyautogui (chỉ hoạt động cho OS X, Windows, Linux).

pyautogui.posistion() //returns tuple with mouse x and y values 
         // same for python 3.x 

tham khảo article này như thế nào để phát hiện các cú click chuột cho cửa sổ

+0

Cảm ơn bạn đã gửi bài. Điều này có vẻ rất hữu ích cho vị trí và chuyển động của chuột, nhưng các sự kiện nút/nhấp bên ngoài cửa sổ ứng dụng cũng có sẵn với các API này không? Ví dụ đơn giản nhất tôi có thể nghĩ về loại chức năng mà tôi đang tìm là ứng dụng ảnh chụp màn hình mà bạn cần nhấp và kéo bên ngoài cửa sổ ứng dụng. Bạn cần có khả năng nhìn thấy các cú click chuột cùng với chuyển động/vị trí của chuột. – TravisT

+1

Trừ những người góa phụ, tôi không nghĩ có bất kỳ phương pháp nào để nhận các sự kiện nhấp chuột bên ngoài cửa sổ của bạn. –

1

Trên Mac, tùy chọn dễ dàng nhất có lẽ là NSEvent 's addGlobalMonitorForEventsMatchingMask:handler:: https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSEvent_Class/#//apple_ref/occ/clm/NSEvent/addGlobalMonitorForEventsMatchingMask:handler:

Lưu ý rằng đây là đặc biệt cho các sự kiện được gửi đến các ứng dụng khác và không phải của riêng bạn.

Ở cấp độ thấp hơn, bạn cũng có thể xem xét sử dụng các nút sự kiện Quartz.Ví dụ đơn giản sử dụng PyObjC:

from Quartz import CGEventTapCreate 
# ...etc. 

def listen_for_mouse_events(): 
    mouse_tap = CGEventTapCreate(
    kCGSessionEventTap, 
    kCGHeadInsertEventTap, 
    kCGEventTapOptionListenOnly, 
    CGEventMaskBit(kCGEventLeftMouseDown) | CGEventMaskBit(kCGEventLeftMouseUp), 
    on_mouse_event, 
    None 
    ) 
    runLoopSource = CFMachPortCreateRunLoopSource(None, mouse_tap, 0) 
    CFRunLoopAddSource(
    CFRunLoopGetCurrent(), 
    runLoopSource, 
    kCFRunLoopDefaultMode 
) 
    CGEventTapEnable(mouse_tap, True) 

def on_mouse_event(proxy, event_type, event, refcon): 
    location = CGEventGetLocation(event) 
    if (event_type == kCGEventLeftMouseDown): 
    pass 
    elif (event_type == kCGEventLeftMouseUp): 
    pass 

(Tôi e rằng tôi không thể bình luận cụ thể về một giải pháp Windows.)

Các vấn đề liên quan