2013-03-11 2 views
1

Я пишу модуль, в котором я хочу поддерживать всплывающие диалоговые окна, чтобы указывать на ошибки, но мне не нужно или не нужно корневое окно (потому что я хочу, чтобы модуль не зависел от основного графического интерфейса и возможность совместного использования между несколькими вызывающими приложениями). Я попробовал просто сделать это:Использование 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!") 

... но несмотря на то, что работает, кажется, klunky к принести модуль и создать экземпляр объекта, чтобы я мог избавиться от него. Плюс я не хочу путать вещи между этим корнем и «настоящим» корнем в вызывающих приложениях.

Возвращаясь к первому примеру, очевидно, что 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 с ним.

Ссылки:

+0

Спасибо за ответ и особенно ссылки. Несмотря на то, что я не могу удалить это автоматически созданное корневое окно, я все равно могу получить результат, который я хочу, потому что он не будет создавать это корневое окно в первую очередь, если я уже создал его в своем собственном вызывающем приложении. (Который я буду, во всех случаях, когда я использую этот модуль.) – JDM

+0

@JDM Доступ к автогенерируемому корневому окну можно получить, создав виджеты без аргумента 'master', а затем вывести его родительский элемент, например' Tkinter.Button() .master.withdraw() '.Тем не менее, это уродливый walkaround, и ваше решение более явное. –

0

Примечание: tkMessageBox не использует tkSimpleDialog, он использует tkCommonDialog. Код tkCommonDialog - here

+0

Хотя эта ссылка может ответить на вопрос, пожалуйста, разместите здесь соответствующую часть, отвечая на вопрос OP, вспомнив, что ссылка может сломаться и/или устаревать –

Смежные вопросы