使用tkMessageBox而不导入Tkinter

时间:2013-03-11 14:13:13

标签: python-2.7 tkinter tkmessagebox

我正在编写一个模块,我想支持弹出对话框以指示错误,但我不需要或不需要根窗口(因为我希望模块独立于主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()吗?

(环境是Windows 7和Python 2.7.3。)

2 个答案:

答案 0 :(得分:2)

tkMessageBox建立在Tkinter之上,因此不可能简单地删除它:模块的所有功能,如tkMessageBox.showwarning,都是_show函数的包装器。此函数根据您使用的对话框类型创建一个Message对象,其中包含不同的参数。 MessageDialog的子类,后者又是Toplevel的子类。

Toplevel是一个Tkinter小部件,因此定义Dialog的此模​​块的第一行(除了注释)是:

from Tkinter import *

你的第二个解决方案是正确使用tkMessageBox的唯一方法,因为你被迫(至少在内部)使用Tkinter。

<强>参考文献:

答案 1 :(得分:0)

注意:tkMessageBox不使用tkSimpleDialog,它使用tkCommonDialog。 tkCommonDialog的代码是 here