Python tkinter 8.5 импортирует окно сообщений

#python #tkinter #import

Вопрос:

Следующий код работает нормально в режиме ожидания, но в противном случае я получаю «Ошибка имени: глобальное имя ‘messagebox’ не определено». Однако, если я прямо заявлю from tkinter import messagebox , что это работает нормально, откуда бы то ни было.

 from tkinter import *
from tkinter import ttk 

root = Tk()
mainFrame = ttk.Frame(root)
messagebox.showinfo("My title", "My message", icon="warning", parent=mainFrame)
 

Почему IDLE не нуждается в явном операторе импорта, но в другом месте он необходим?

Комментарии:

1. IDLE-это программа tkinter, поэтому у нее есть свой собственный импорт и root. Это плохая идея программировать с tkinter в режиме ожидания. Чтобы избежать нежелательного поведения, лучше использовать консоль.

Ответ №1:

ящик сообщений является отдельным подмодулем tkinter, поэтому просто выполните полный импорт из tkinter:

 from tkinter import *
 

не импортирует messagebox

он должен быть явно импортирован следующим образом:

 from tkinter import messagebox
 

точно так же, как ttk должен быть импортирован явно

причина, по которой он работает в режиме ожидания, заключается в том, что idle импортирует messagebox для своих собственных целей, и из-за того, как работает режим ожидания, его импорт доступен во время работы в режиме ожидания

Комментарии:

1. Имеет смысл. Хороший ответ.

Ответ №2:

IDLE написан на Python и использует Tkinter для графического интерфейса, поэтому похоже, что ваша программа использует import операторы, которые использует сам IDLE. Однако вы должны явно включить import инструкцию для параметра messagebox , если вы хотите выполнить свою программу вне процесса простоя.

Ответ №3:

messagebox.showinfo определяется внутри tkinter/showinfo.py , но при использовании from tkinter import * вы импортируете только tkinter/__init__.py то, что содержит определения Label , Entry , Button ,… Вот как работает импорт python.

Когда вы используете from tkinter import messagebox его, он ищет messagebox внутри tkinter/__init__.py , но не может его найти, поэтому пытается импортировать tkinter/messagebox.py

Что касается аномалии ПРОСТОЯ, то это ошибка в режиме ОЖИДАНИЯ, и я считаю, что она была исправлена.