#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
Что касается аномалии ПРОСТОЯ, то это ошибка в режиме ОЖИДАНИЯ, и я считаю, что она была исправлена.