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()了?

(环境是 Windows 7 和 Python 2.7.3。)

4

2 回答 2

2

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

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

from Tkinter import *

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

参考:

于 2013-03-11T15:59:27.040 回答
0

注意:tkMessageBox 不使用 tkSimpleDialog,它使用 tkCommonDialog。tkCommonDialog 的代码在 这里

于 2015-02-10T12:55:46.623 回答