28

TkinterとでPython2を使用していてPyObjC、次に。を使用してpy2appいます。

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

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

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

4

8 に答える 8

48

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

app = SampleApp()

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

app.mainloop()
于 2017-07-12T18:15:30.780 に答える
27

今日も同じ問題に遭遇しました。OS X ライオン 10.7.2。mainloop()問題を解決する前に、このコードを追加してください。

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

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

于 2012-03-03T05:42:21.653 に答える
15

あなたが与えたコードを取得し、最初と最後の行を追加すると、次のようになります。

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()このような場合にウィンドウをスタックの前面に移動するコマンドの追加が含まれており、他のすべての場合には無害です。

于 2012-01-01T04:09:28.583 に答える
15

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()
于 2013-07-02T23:28:59.320 に答える
3

上記のソリューションを修正したところ、これらの 2 行が OSX で機能しました。ウィンドウを最前面に移動しますが、ウィンドウを常に最前面として動作させることはありません。

root.call('wm', 'attributes', '.', '-topmost', True)
root.after_idle(root.call, 'wm', 'attributes', '.', '-topmost', False)
于 2013-05-30T05:35:02.410 に答える
1

アプリケーション タイトルが「Python」のプロセスが複数ある場合、osascript トリック Arnaud P には問題が生じる可能性がありますさらに、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))
于 2016-07-09T23:15:49.600 に答える