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

Следующий код отлично работает в IDLE, но в противном случае я получаю «NameError: глобальное имя« 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 не требуется явный оператор импорта, но в других местах он требуется?


person Big Sharpie    schedule 14.07.2014    source источник
comment
IDLE - это программа tkinter, поэтому у нее есть собственный импорт и корень. Программировать с помощью tkinter в IDLE — плохая идея. Чтобы избежать экстравагантного поведения, лучше использовать консоль.   -  person Trimax    schedule 14.07.2014


Ответы (3)


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

from tkinter import *

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

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

from tkinter import messagebox

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

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

person James Kent    schedule 14.07.2014
comment
Имеет смысл. Хороший ответ. - person Big Sharpie; 14.07.2014

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

person A. Rodas    schedule 14.07.2014

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

Что касается аномалии IDLE, то это ошибка в IDLE, и я считаю, что она была исправлена.

person TheLizzard    schedule 14.05.2021