6

私は次のようなコードでフルフレーム(装飾なし)ウィンドウを作成しています(Python 3.2ではtkinterを使用):

self.root = Tk()    
self.W, self.H = self.root.winfo_screenwidth(), self.root.winfo_screenheight()
self.root.overrideredirect(1) # full screen, no menu or borders
self.root.geometry("%dx%d+0+0" % (self.W, self.H))

ファイルダイアログまたはメッセージボックスを開こうとすると、フレームウィンドウ全体の下に表示されます。ダイアログの1つを開く前に、メインウィンドウでwithdraw()を呼び出すことで、これを確認できます。例えば、

   file = tkinter.filedialog.askopenfilename(parent=self.root) # UNDER main window

Windowsではこれに問題はありません。fedora14とubuntu12.04でのみ問題に気づきました。(私はMacでテストしていません)。私は親をダイアログに渡しますが、彼らは注意を払っていないようです。誰かが私が間違っていることを理解するのを手伝ってもらえますか?ありがとう。

4

1 に答える 1

3

ウィンドウでの呼び出し.overrideredirect(1)は、WindowsとX11では異なる意味を持ちます。Windowsでは、ウィンドウの境界線の描画を無効にするようにOSに指示します。X11では、ウィンドウマネージャーにウィンドウを完全に無視するように指示します。現実的には、X11と同じ効果がWindowsにあるはずですが、そうではありません。

呼び出す.overrideredirect(1)とウィンドウが一番上にとどまる理由は、X11がウィンドウを制御できないためです(ウィンドウの表示はウィンドウマネージャーによって処理されないため)。プログラムウィンドウとウィンドウマネージャーは完全に独立しているため、標準のウィンドウスタッキングを実装しても意味がありません。

tkinterだけでは、この動作を防ぐためにできることは何もありません。tkinterは実際には問題の原因ではないからです。X11 Pythonバインディングを使用してフレームなしでウィンドウを表示する方法があるかもしれませんが、これはプラットフォーム固有のコードになります。

ウィンドウの境界線を削除することを再考することをお勧めします。可能な代替案はありますか?ウィンドウの境界線を含むフルスクリーンウィンドウは適切なオプションです。アクセシビリティ上の理由(移動、最小化、最大化などの方法がない)のため、ウィンドウの境界線を削除することは、最善の場合にはお勧めできません。また、個人的には、Linuxユーザーとして、ウィンドウの境界線をあらゆる種類の機能(ウィンドウのタブ、シェードボタンなど)でカスタマイズしており、それらを頻繁に使用しています。ウィンドウの境界線を削除すると、そのような機能は使用できなくなります。

于 2012-08-18T01:29:08.977 に答える