2012-01-01 168 views
14

我使用Python 2與TkinterPyObjC,然後我使用py2app如何將tkinter窗口置於其他窗口之上?

該程序工作正常,但是當我打開該程序時,該窗口以隱藏方式啓動,所以直到我點擊擴展塢上的圖標才顯示出來。

有沒有什麼辦法來控制它,使窗口在應用程序啓動時打開的其他窗口上?

只是爲了澄清,它並不一定是在整個應用程序運行時的頂部。我只需要它在啓動時在其他窗口之上。

+1

的可能的複製[如何使一個窗口跳到前面?](http://stackoverflow.com/questions/1892339/how-to-make-a-window-jump-to-the-front) – 2017-04-04 18:02:23

回答

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的窗口可能落後於已經打開顯示(這在這裏有一個bug報告:http://bugs.python.org/issue9384但不會解決已關閉)。在這些情況下,增加了root.lift()命令以將窗口置於堆棧的前面,並且在所有其他情況下都是無害的。

+0

我得到了它解決了。這是因爲我的代碼在文件名中有一段時間(「。」)。當我從文件名中刪除這段時間時,窗口顯示在最上面,但我不確定它們是如何關聯的。不管怎麼說,還是要謝謝你! – Dennis 2012-01-01 04:49:13

+0

很高興爲您服務。 :) – vdbuilder 2012-01-01 04:55:14

+0

其實,現在它不再顯示在頂部。我不知道它爲什麼會來回移動,但我猜測窗口管理器出了什麼問題,顯然是因爲它甚至沒有更改代碼中的任何內容。有沒有辦法強制窗口與PyObjC頂部?我一直在搜索它,但沒有任何好的答案... @vdbuilder – Dennis 2012-01-01 06:10:34

15

今天我遇到了同樣的問題。 OSX LION 10.7.2。在mainloop()解決此問題之前添加此代碼。

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

但窗口始終保持在其他人之上,直到您關閉它爲止。爲了實現真正的解決方案,我們需要使用py2app將它變成一個應用程序包。

3

我修改了上述解決方案,這兩行適用於OSX。它將窗口置於前面,但不會使窗口像Always on Top一樣運行。

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

在Mac OS 10.11.2中不起作用您需要'root.lift()',就像在@ jjaderberg的回答中一樣 – George 2016-02-12 02:10:49

11

對於OS X 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

在Sierra爲我工作謝謝 – jamescampbell 2017-08-25 17:09:43

5

更多的Mac之前OS用戶。儘管上述解決方案似乎正確顯示,但從Finder的角度來看,該應用程序仍處於「堆棧的盡頭」。正如可以看到Cmd+Tab切換器,或者只是觀察python沒有得到重點。

username解決方案(同樣適用於Mac OS)固定這一切:

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

實際上,使用此代碼,使得其他提供的解決方案是多餘的,儘管它們可能比OS X在其他平臺上有更多的優勢,但還沒有嘗試過,謝謝! – yair 2014-11-23 14:36:17

0

osascript trick Arnaud P可能有問題,如果有一個以上的使用應用標題'Python'進行處理;此外,它不會爲Python 3的過程中工作(需要被稱爲「Python3」然後。

然而,我發現another trick可以通過使用進程ID解決問題。

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

這是最好的答案(在osx上也能正常工作)。謝謝你。 – 2017-10-16 19:02:26

相關問題