2012-01-01 28 views
14

मैं अजगर 2 का उपयोग कर रहा Tkinter और PyObjC साथ, और फिर मैं py2app उपयोग कर रहा हूँ।दूसरों के शीर्ष पर एक टिंकर विंडो कैसे डालें?

कार्यक्रम ठीक काम कर रहा है, लेकिन जब भी मैं प्रोग्राम खोलने विंडो के रूप में छिपा शुरू होता है, इसलिए जब तक मैं इसे ऊपर लाने के लिए गोदी पर आइकन पर क्लिक करें यह प्रकट नहीं होता है।

इस नियंत्रित करने के लिए किसी भी तरह से, खिड़की अन्य विंडो जब आवेदन शुरू कर रहा है कि खुले थे के शीर्ष पर होना करने के लिए कर है?

बस स्पष्ट करने के लिए है, यह पूरे समय आवेदन चल रहा है के लिए शीर्ष पर होने की जरूरत नहीं है। जब इसे शुरू होता है तो मुझे बस अन्य विंडो के शीर्ष पर होना चाहिए।

+1

की संभावित डुप्लिकेट [सामने के लिए एक खिड़की कूद बनाने के लिए?] (http://stackoverflow.com/प्रश्न/18 9 233 9/कैसे-टू-मेक-ए-विंडो-कूद-टू-द-फ्रंट) –

उत्तर

10

अगर मैं कोड आप दे सकते हैं और पहली और आखिरी पंक्ति आपको मिल जोड़ने ले:

from tkinter import * 

root = Tk() 
root.title("app") 
screen_width = root.winfo_screenwidth() 
screen_height = root.winfo_screenheight() 
root.geometry("550x250+%d+%d" % (screen_width/2-275, screen_height/2-125)) 
root.configure(background='gold') 
root.lift() 

mainloop() 

टेस्ट यह। मुझे खिड़की की उम्मीद है। क्या आपको कुछ और मिलता है? यदि यह कोड में कहीं भी काम करता है तो आप इसे करने के लिए कह रहे हैं। यदि यह आपके असली कार्यक्रम की तरह ही काम करता है तो आपका विंडो प्रबंधक इसे कर रहा है। यह सबसे अच्छा है जो मैं बिना किसी जानकारी के कर सकता हूं।

संपादित करें:

पर OSX (espicially एक्वा का उपयोग कर संस्करण) tkinter की खिड़कियों उन है कि पहले से ही खुले हैं के पीछे प्रदर्शित हो सकता है (यह एक बग रिपोर्ट यहाँ है: http://bugs.python.org/issue9384 लेकिन जैसा कि ठीक नहीं होगा बंद कर दिया गया)। खिड़की को उन मामलों में ढेर के सामने लाने के लिए root.lift() कमांड को शामिल किया गया है और अन्य सभी में हानिरहित है।

+0

मुझे मिला यह हल हो गया। ऐसा इसलिए था क्योंकि मेरे कोड में फ़ाइल का नाम ("।") था। जब मैंने फ़ाइल नाम से अवधि हटा दी तो विंडो शीर्ष ठीक दिखाई दी, हालांकि मुझे यकीन नहीं है कि वे कैसे संबंधित हैं। फिर भी धन्यवाद! – Dennis

+0

सेवा की खुशी है। :) – vdbuilder

+0

दरअसल, अब यह शीर्ष पर नहीं दिख रहा है। मुझे नहीं पता कि यह आगे और आगे क्यों जाता है, लेकिन मुझे लगता है कि खिड़की प्रबंधक के साथ कुछ गड़बड़ है, जाहिर है क्योंकि यह ऐसा कर रहा है जब मैंने कोड में कुछ भी नहीं बदला। क्या पीओओबीजेसी के साथ खिड़की को शीर्ष पर मजबूर करने का कोई तरीका है? मैं इसे खोज रहा हूं लेकिन कोई अच्छा जवाब नहीं रहा है ... @vdbuilder – Dennis

15

मैं आज एक ही मुद्दे में मिला है। ओएसएक्स शेर 10.7.2। mainloop() से पहले इस कोड को हल करें इस समस्या को हल करता है।

root.call('wm', 'attributes', '.', '-topmost', '1') 

लेकिन खिड़की हमेशा इसे बंद करने तक दूसरों के शीर्ष पर बना रहता है। वास्तविक हल करने के लिए, हमें इसे एक ऐप बंडल बनाने की ज़रूरत है, py2app के साथ।

3

मैं ऊपर समाधान संशोधित और इन 2 लाइनों पर OSX मेरे लिए काम। यह खिड़की को सामने लाता है, लेकिन विंडो को हमेशा शीर्ष पर व्यवहार करने के बिना।

root.call('wm', 'attributes', '.', '-topmost', True) 
root.after_idle(root.call, 'wm', 'attributes', '.', '-topmost', False) 
+1

मैक ओएस 10.11.2 में काम नहीं कर रहा है। आपको @ jjaderberg के जवाब में 'root.lift()' की आवश्यकता है। – George

11

ओएस एक्स 10.8.3 के लिए, vdbuilder और user2435139 द्वारा प्रदान की जवाब के संयोजन चाल मेरे लिए यानी

self.root.lift() 
self.root.call('wm', 'attributes', '.', '-topmost', True) 
self.root.after_idle(self.root.call, 'wm', 'attributes', '.', '-topmost', False) 

बुलाया

self.root.mainloop() 
+0

सिएरा में मेरे लिए काम किया धन्यवाद – jamescampbell

5

मैक के लिए अधिक से पहले किया था, ओएस उपयोगकर्ता। यद्यपि उपर्युक्त समाधान सही तरीके से प्रदर्शित होने लगते हैं, फिर भी ऐप को खोजक के दृष्टिकोण से "स्टैक के अंत" पर रखा जाता है। जैसा कि Cmd+Tab स्विचर के साथ देखा जा सकता है, या बस यह देखकर कि पाइथन को फोकस नहीं मिलता है।

username से समाधान यह सब फिक्सिंग (फिर से, मैक ओएस के लिए):

import os 
os.system('''/usr/bin/osascript -e 'tell app "Finder" to set frontmost of process "Python" to true' ''') 

हो सकता है कि चारों ओर

के साथ कुछ तरह
import platform 
if "Darwin" in platform.system(): 
    # apply fix 
+0

असल में , इस कोड का उपयोग करके, अन्य प्रस्तावित समाधान अनावश्यक बनाता है। हालांकि, उन्हें ओएस एक्स की तुलना में अन्य प्लेटफार्मों पर अधिक लाभ हो सकता है, अभी तक कोशिश नहीं की है। धन्यवाद! – yair

0

osascript trick Arnaud P, समस्याओं हो सकता है अगर वहाँ एक से अधिक आवेदन शीर्षक 'पायथन' के साथ प्रक्रिया; इसके अतिरिक्त, यह अजगर 3 प्रक्रियाओं के लिए काम करेंगे नहीं ('python3' तो कहा जाता है की जरूरत है।

हालांकि, मैं another trick है कि इस प्रक्रिया आईडी का उपयोग करके समस्या का समाधान कर सकते हैं पाया।

import os 
script = 'tell application "System Events" \ 
    to set frontmost of the first process whose unix id is {pid} to true'.format(pid=os.getpid()) 
os.system("/usr/bin/osascript -e '{script}'".format(script=script)) 
4

मैं यह जानता हूँ एक पुराने सवाल है, लेकिन मैं यह अजीब है कि कोई भी सरल समाधान मैं था के साथ आया था, पाया

app = SampleApp() 

app.attributes('-topmost', True) 
app.update() 
app.attributes('-topmost', False) 

app.mainloop() 
+2

यह सबसे अच्छा जवाब है (ओएसएक्स पर भी ठीक काम करता है)। तुमको –