2013-07-21 35 views
10

Tôi đang viết một ứng dụng bằng Python với khung giao diện Tkinter GUI. Nó lắng nghe các sự kiện bàn phím và chuột, vì vậy nó phải có tiêu điểm. Khi nó được phóng đi từ một thiết bị đầu cuối trong Ubuntu, đoạn mã sau hoạt động:Lấy nét cửa sổ Tkinter trên Mac OS X

from Tkinter import * 

root = Tk() 
root.focus_force() 

def key(event): 
    print "pressed", event.char 

def callback(event): 
    print "clicked at", event.x, event.y 

frame = Frame(root, width=100, height=100) 
frame.bind("<Key>", key) 
frame.bind("<Button-1>", callback) 
frame.pack() 
frame.focus_force() 

root.mainloop() 

Tuy nhiên, khi phóng đi từ một thiết bị đầu cuối trong Mac OS X 10.8.4 (chứng khoán Python 2.7.2), tập trung được giữ lại bởi các thiết bị đầu cuối giả lập cho đến khi người dùng nhấp vào cửa sổ. Có ai biết về một workaround cho điều này?

Trả lời

9

tôi đã cố gắng này và nó làm việc tốt cho tôi:

from os import system 
from platform import system as platform 

# set up your Tk Frame and whatnot here... 

if platform() == 'Darwin': # How Mac OS X is identified by Python 
    system('''/usr/bin/osascript -e 'tell app "Finder" to set frontmost of process "Python" to true' ''') 

Tất nhiên, điều đó sẽ mang lại cho toàn bộ ứng dụng của bạn để phía trước, không chỉ là một cửa sổ cụ thể, nhưng sau khi bạn làm điều đó, bạn có thể sử dụng focus_force() trên một khung hoặc cửa sổ cụ thể và sẽ được di chuyển để trở thành mặt trước của tất cả các cửa sổ ứng dụng của bạn.

Đối với những người quan tâm, tôi không tự viết lời gọi system(). Tôi tìm thấy nó trong this thread on SourceForge.

Thực tế là tôi đặt cuộc gọi system() trong một khối nếu xác minh điều này đang chạy trên OS X làm nền tảng giải pháp - sự hiểu biết của tôi là focus_force() hoạt động trên tất cả các nền tảng khác chính xác như bạn muốn và chỉ thực hiện sau yêu cầu system() cũng sẽ không gây ra bất kỳ sự cố nào trong OS X.

+1

Một cách dễ dàng bởi-gosh-make-it-work-now hack :-). Cảm ơn! – yair

-1

Trợ giúp wait_visibility và event_generate?

ví dụ: một cái gì đó giống như -

from Tkinter import * 

root = Tk() 

def key(event): 
    print "pressed", event.char 

def callback(event): 
    print "clicked at", event.x, event.y 

frame = Frame(root, width=100, height=100) 
frame.bind("<Key>", key) 
frame.bind("<Button-1>", callback) 
frame.pack() 

frame.focus_set() 

root.wait_visibility() 
root.event_generate('<Button-1>', x=0, y=0) 

root.mainloop() 
+0

Rất tiếc, không phải –

2

đến đây tự hỏi cùng một câu hỏi, nhưng tôi tìm thấy câu trả lời này nghe có vẻ khôn ngoan từ Kevin Walzer mà gợi ý để sử dụng py2app:

Có, đây là hành vi tiêu chuẩn cho OS X. Chạy một ứng dụng trong Thiết bị đầu cuối giữ tiêu điểm trong Thiết bị đầu cuối trừ khi bạn chuyển bằng cách nhấp vào các cửa sổ. Hành vi Command-Tab được xác định bởi hệ thống cửa sổ, không phải bởi một quy trình mới được tạo ra bởi .

Cách xung quanh việc này là bao bọc ứng dụng của bạn trong ứng dụng Mac chuẩn gói bằng py2app. Người dùng Mac trung bình sẽ không khởi chạy trò chơi dựa trên Python từ dòng lệnh.

Kevin

(từ https://groups.google.com/forum/#!topic/comp.lang.python/ZPO8ZN5dx3M)

+0

Bạn cũng có thể sử dụng [pyinstaller] (http://www.pyinstaller.org/). Tôi thích nó vì tôi có thể làm cho cả hai gói ứng dụng Mac và Windows thực thi. – Fiver