Использование tkMessageBox без импорта Tkinter
Я пишу модуль, в котором я хочу поддерживать всплывающие диалоговые окна для индикации ошибок, но мне не нужно или не нужно корневое окно (потому что я хочу, чтобы модуль был независим от основного графического интерфейса пользователя и мог использоваться совместно несколькими вызывающими приложениями), Я попытался просто сделать это:
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 ответа
tkMessageBox построен поверх Tkinter, поэтому от него просто невозможно избавиться: все функции модуля, такие как tkMessageBox.showwarning
Обертки _show
функция. Эта функция создает Message
объект, с различными аргументами в зависимости от типа используемого вами диалога. Message
это подкласс Dialog
который, в свою очередь, является подклассом Toplevel
,
Toplevel
виджет Tkinter, поэтому самая первая строка этого модуля (кроме комментариев) где Dialog
определяется как:
from Tkinter import *
Ваше второе решение - единственный способ правильно использовать tkMessageBox, так как вы вынуждены использовать (по крайней мере, внутренне) Tkinter вместе с ним.
Рекомендации:
Примечание: tkMessageBox не использует tkSimpleDialog, он использует tkCommonDialog. Код tkCommonDialog находится здесь