2

Tkinter が時々フラストレーションを感じることがあることは知っていますが、次のようになる Tkinter/ttk トップレベル ウィジェット/ウィンドウへの呼び出しの「正しい」シーケンスに困惑しています。

  1. ウィンドウを画面の中心に表示し、中心からずらして描画したり移動したりしません。

  2. ウィンドウのサイズを適切に調整します。

  3. ウィンドウを親フォームのトップレベルにしますが、システム モーダルにはしません (つまり、システム上のすべてのアプリ/ウィンドウのトップレベルにはしません)。

  4. 必要に応じて、Windows でタスクバー ボタンを作成します。

これは、簡単にするためにいくつかの無関係なビットを削除した、これまでの現在のコードです。

def __init_ui__(self):
    #// Basic setup.
    self.wm_overrideredirect(False)
    self.wm_resizable(False, False)
    self.configure(relief=FLAT, borderwidth=4)

    #// <Some extraneous widget-creation here>

    #// Done!
    self.update()
    self.withdraw()
    self.update_idletasks()
    self.grid()
    self.transient(self._parent)
    self.grab_set()
    self.form.initial_focus()  #// sets initial focus before the window is displayed
    center(self)  #// https://stackoverflow.com/a/10018670
    self.deiconify()
    self._parent._parent.wait_window(self) #// Reaches back to the root Tk() obj.
    # ENDIF
# END __init_ui__

このフォームは、一連のウィジェット作成呼び出しをラップする、私が作成したカスタム クラスを継承しており、クラスは から継承していobjectます。2 番目の継承は から取得され、さまざまな呼び出しやその他の Tkinterttk.Toplevel機能へのアクセスを提供します。self.wm_*

そうは言っても、私の関数呼び出しのいくつかは不要であると確信しています。しかし、この特定の呼び出し順序は、Windows 7 でほとんどうまく機能するようです。ただし、X11-over-ssh ( Windows の X サーバーにXmingを使用) では、状況は少し奇妙になります。その場合、self.update()後に移動するとself.withdraw()、ウィンドウは Windows 7 で再描画なしで正しく中央に配置されますが、X11 では非表示のときに描画されて適切に中央に配置されますが、ジオメトリはゼロです (圧縮されたウィンドウの境界線/装飾のみ)。示されています)。あたかもグリッドの伝播が発火しなかったかのようです。

しかし、self.update()現在のところ、ウィンドウとX11の両方でウィンドウのサイズを適切に調整し、中央に配置していますが、ウィンドウが中心から外れて作成され、両方の中央に移動されていることがわかります。

Windowsで使用するself.wm_attributes("-toolwindow", 1)と、ウィンドウは表示されずに中央に配置されますが-toolwindow、Windowsシステムでのみ機能します。X11 と Aqua の両方に対して無効なコマンドです。

tk::windowingsystemウィンドウマネージャーが何であるかを判断するために常にを呼び出し、Windows と X11 に異なるハックを適用する必要は避けたいと思います。また、Mac/Aqua をテストすることはできません (所有していないので、購入するつもりはありません)。

さらに、WindowsとリモートX11の両方で別のウィンドウ/アプリをクリックすると、タスクバーボタンを介してメインフォームをクリックして戻ると、メインフォームのみが表示されます-子トップレベルウィンドウは、メイン内の任意の場所をクリックしたときにのみポップアップします形。 Fixedself._transient() : (ちょっと) --親を指定することでちょっと修正された引数を追加するのを忘れていました。今夜の初めに、親の引数を渡さなかったので、フォーカスが正しくありませんでした。

では、Tkinter/ttk トップレベル ウィンドウのサイズを変更し、中央に配置し、ルート ウィンドウでない場合に適切にフォーカスを取得するための、ある種の実証済みのマジック レシピまたはエンシェント ムーの司祭への呼び出しはありますか? 最小限の X11、Motif-look を使用します。

いいえ、私は PyGTK、PyQT、wxPython、またはその他のツールキットを使用していません。これは、標準の Tkinter/ttk またはバストです。これは、私がここ数週間、ラッパー関数の学習と作成に費やしてきたものだからです。私が作成したオートコンプリート コンボボックスは、かわいくて小さな仕掛けです。まだ少しバグがありますが、それは別のSOの質問のトピックです...


PS、Effbot の Tkinter クックブックはダウンしています。サーバークラッシュのようです。たまたまそのサイトをミラーリングした人はいますか?

4

1 に答える 1

2

解決しました!呼び出しの順序を少し調整する必要がありました。

#// Done!
self.withdraw()
self.grid()
self.transient(self._parent)
self.grab_set()
self.form.initial_focus()
center(self)
self.deiconify()
self._parent._parent.wait_window(self)

しかし、本当の修正は、/への呼び出しを/に変更し、 の最初の呼び出しとしてへの呼び出しを追加することにより、この回答center()から取り上げた関数にありました。これで、ダイアログ ウィンドウが移動せずに中央にポップアップし、フォーカスが正しく適用され、Windows とリモート X11 の両方で動作するようになりました。いつの日か、Mac OS X/Aqua でどれだけうまく動作するかがわかる日が来るかもしれません。winfo_width()winfo_height()winfo_reqwidth()winfo_reqheight()update()center()

于 2013-06-27T23:05:32.390 に答える