2013-07-21 8 views
10

पर टिंकर विंडो फोकस मैं टिंकर जीयूआई ढांचे के साथ पायथन में एक एप्लीकेशन लिख रहा हूं। यह कीबोर्ड और माउस घटनाओं के लिए सुनता है, इसलिए यह ध्यान केंद्रित होना चाहिए। यह Ubuntu में एक टर्मिनल से शुरू किया जाता है, तो निम्न कोड काम करता है:मैक ओएस एक्स

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() 

हालांकि, जब मैक ओएस एक्स 10.8.4 (शेयर अजगर 2.7.2) में एक टर्मिनल से शुरू की, ध्यान टर्मिनल द्वारा बनाए रखा है जब तक उपयोगकर्ता विंडो पर क्लिक नहीं करता तब तक एमुलेटर। क्या किसी के लिए इसके कामकाज के बारे में पता है?

उत्तर

9

मैं इस कोशिश की और यह मेरे लिए अच्छी तरह से काम:

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' ''') 

बेशक, उस मोर्चे के लिए अपने पूरे आवेदन लेकर आता हूँ, न केवल एक विशिष्ट खिड़की, लेकिन ऐसा करने के बाद, आप किसी विशिष्ट फ्रेम या विंडो पर focus_force() का उपयोग कर सकते हैं और यह आपके सभी एप्लिकेशन विंडो का सबसे आगे बनने के लिए स्थानांतरित हो जाएगा।

रुचि रखने वालों के लिए, मैंने system() खुद को कॉल नहीं किया था। मैंने इसे this thread on SourceForge में पाया।

तथ्य यह है कि मैं एक अगर ब्लॉक, जो यह सत्यापित उन्हें इस OS X पर चल रहा है के भीतर system() कॉल डाल समाधान क्रॉस प्लेटफॉर्म बना देता है - मेरी समझ है कि अन्य सभी प्लेटफार्मों पर काम करता है focus_force() आप चाहते हैं, और बस के बाद यह प्रदर्शन बिल्कुल के रूप में system() आमंत्रण ओएस एक्स में किसी भी समस्या का कारण नहीं बनता है, या तो।

+1

एक आसान बाय-गोश-मेक-इट-वर्क-अब हैक :-)। धन्यवाद! – yair

-1

प्रतीक्षा करें दृश्यता और घटना_जनन सहायता करें?

उदाहरण के लिए। कुछ की तरह -

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

दुर्भाग्य से –

2

वही सवाल सोच यहाँ आया है, लेकिन मैं जो उपयोग करने के लिए पता चलता है केविन वॉल्ज़र से बुद्धिमान लग जवाब पाया py2app:

हाँ, यह ओएस एक्स चल रहा है के लिए मानक व्यवहार है टर्मिनल में एक ऐप टर्मिनल में फ़ोकस रखता है जब तक आप विंडोज़ पर क्लिक करके स्विच नहीं करते। कमांड-टैब व्यवहार विंडोिंग सिस्टम द्वारा निर्धारित किया जाता है, न कि द्वारा नव निर्मित प्रक्रिया द्वारा।

इसके आसपास का तरीका एक मानक मैक ऐप बंडल में py2app का उपयोग करके अपने एप्लिकेशन को लपेटना है। औसत मैक उपयोगकर्ता कमांड लाइन से पायथन-आधारित गेम लॉन्च नहीं करेगा।

केविन

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

+0

आप [pyinstaller] (http://www.pyinstaller.org/) का भी उपयोग कर सकते हैं। मुझे यह पसंद है क्योंकि मैं मैक ऐप बंडल और विंडोज एक्जिक्यूटिव दोनों बना सकता हूं। – Fiver