1

エラーを示すポップアップダイアログをサポートしたいモジュールを書いていますが、ルートウィンドウは必要ありません(モジュールをメインGUIから独立させ、複数の呼び出し元アプリケーション間で共有できるようにするため) 。私は単にこれをやってみました:

import tkMessageBox
[...stuff...]
if (errorCondition): tkMessageBox.showwarning("My Module","That won't work!")

...しかし、実行すると、メッセージボックスの横にルートウィンドウが表示されます。メソッドについては知っていますwithdraw()が、自分自身をインポートTkinterしたりインスタンス化したりしTkinter.Tk()たことがないため、使用するオブジェクトはありませんwithdraw()

うまくいく別の方法は、Tkinterとにかく先に進んでインポートすることです。そうすれば、自分でルートウィンドウを作成してから、次のようにできますwithdraw()

import Tkinter
import tkMessageBox
root = Tkinter.Tk()
root.withdraw()
[...stuff...]
if (errorCondition): tkMessageBox.showwarning("My Module","That won't work!")

...しかし、それは機能しますが、モジュールを取り込み、オブジェクトをインスタンス化して、それを取り除くことができるようにするのは厄介なようです。さらに、このルートと呼び出し元のアプリケーションの「実際の」ルートとの間で物事を混同したくありません。

最初の例に戻ると、内部でtkMessageBox何かを実行してルートウィンドウを独自に作成していることは明らかです。そのルートウィンドウへの参照を取得して取得できる方法はありますwithdraw()か?

(環境はWindows7およびPython2.7.3です。)

4

2 に答える 2

2

tkMessageBoxはTkinterの上に構築されているため、単純に取り除くことはできません。モジュールのすべての関数は、のようtkMessageBox.showwarningに、関数のラッパーです_show。この関数は、Message使用するダイアログのタイプに応じて異なる引数を持つオブジェクトを作成します。MessageはのサブクラスでありDialog、これは。のサブクラスですToplevel

ToplevelはTkinterウィジェットであるため、このモジュールの最初の行(コメントを除く)Dialogは次のように定義されています。

from Tkinter import *

2番目のソリューションはtkMessageBoxを正しく使用する唯一の方法です。これは、Tkinterを(少なくとも内部的に)使用することを余儀なくされているためです。

参照:

于 2013-03-11T15:59:27.040 に答える
0

:tkMessageBoxはtkSimpleDialogを使用せず、tkCommonDialogを使用します。tkCommonDialogのコードは こちら

于 2015-02-10T12:55:46.623 に答える