Использование 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 находится здесь

Другие вопросы по тегам