web-dev-qa-db-ja.com

他のウィンドウの上にtkinterウィンドウを置く方法は?

Python 2 with TkinterPyObjCを使用していて、py2app

プログラムは正常に動作していますが、プログラムを開くとウィンドウが非表示になり、ドックのアイコンをクリックして表示するまで表示されません。

これを制御する方法はありますか?ウィンドウを、アプリケーションの起動時に開いていた他のウィンドウの上に表示しますか?

明確にするために、アプリケーションが実行されている間中、一番上にある必要はありません。起動時に他のウィンドウの上に配置する必要があります。

20
Dennis

私があなたが与えたコードを取り、あなたが得る最初と最後の行を追加すると:

_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(特にaquaを使用するバージョン)では、tkinterのウィンドウがすでに開いているウィンドウの後ろに表示される場合があります(これにはバグレポートがあります: http://bugs.python.org/issue9384 として閉じられました直らないでしょう)。 root.lift()コマンドの追加は、これらの場合にウィンドウをスタックの前面に表示するために含まれており、他の場合は無害です。

11
vdbuilder

今日も同じ問題に入りました。 OSX LION 10.7.2。 mainloop()が問題を解決する前に、このコードを追加してください。

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

ただし、ウィンドウは閉じるまで常に他のウィンドウの上に表示されます。実際に解決するには、py2appを使用してそれをApp Bundleにする必要があります。

19
Sarim

私はこれが古い質問であることを知っていますが、私が持っていた簡単な解決策を誰も考え出さなかったのは奇妙でした、

app = SampleApp()

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

app.mainloop()
15
Jake

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

Mac OSユーザー向けの詳細。上記のソリューションは正しく表示されているように見えますが、Finderから見ると、アプリは「スタックの最後」に置かれています。 Cmd+Tabスイッチャーで見ることができるように、または単にpythonがフォーカスを取得しないことを確認します。

sername からの解決策(すべて、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
5
Arnaud P

上記のソリューションを変更しましたが、これらの2行はOSXで動作します。ウィンドウを前面に表示しますが、ウィンドウを常に手前に表示することはできません。

root.call('wm', 'attributes', '.', '-topmost', True)
root.after_idle(root.call, 'wm', 'attributes', '.', '-topmost', False)
3
yiotix

osascript trick Arnaud P は、アプリケーションタイトルが「Python」のプロセスが複数ある場合、問題が発生する可能性があります。さらに、Python 3プロセスでは機能しません(その場合、「Python3」と呼ばれる必要があります)。

しかし、プロセス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))
1
Debilski