Импорт из пакета в IDLE vs Shell

Импорт всего пакета работает в IDLE, но не в оболочке. В IDLE отлично работает следующее:

import tkinter as tk
tk.filedialog.askopenfilename()

В оболочке я получаю эту ошибку:

AttributeError: 'module' object has no attribute 'filedialog'

Я понимаю, что мне нужно import tkinter.filedialog, чтобы это работало в оболочке.

В чем разница между IDLE и оболочкой? Как я могу заставить IDLE действовать как оболочка? Может быть неприятно, когда скрипт работает в IDLE и не работает в оболочке.

Я использую Python 3.4.


person mcu    schedule 06.08.2016    source источник
comment
comment
@TerryJanReedy Да, в этом посте описана аналогичная проблема. Разве среда сценария не должна быть изолирована от того, что IDLE использует для своих нужд? А также, если я ввожу tkinter или tk в IDLE, он говорит name 'tkinter' is not defined или name 'tk' is not defined, что должно быть определено, если объяснение в этом другом посте верное.   -  person mcu    schedule 06.08.2016
comment
Я отозвал запрос на закрытие, потому что вы спросили не «почему», что вы поняли, а «как исправить». Я ответил на это ниже. И да, среда сценариев должна быть максимально изолирована. Это причина для выполнения кода в отдельном процессе. В документе IDLE есть раздел 3.2. IDLE — различия консолей, в которых перечислены некоторые неизбежные. Я все еще работаю над тем, чтобы свести к минимуму количество дополнительных модулей в sys.modules. (bugs.python.org/issue27534). Текущее сокращение сокращает время импорта в run.py для меня на 45%.   -  person Terry Jan Reedy    schedule 06.08.2016


Ответы (1)


Это ошибка IDLE, которую я исправил для будущих выпусков 3.5.3 и 3.6.0a4. Проблема с трекером.

Для существующей версии 3.5 или 3.4 добавьте следующее в файл idlelib/run.py непосредственно перед строкой LOCALHOST.

for mod in ('simpledialog', 'messagebox', 'font',
            'dialog', 'filedialog', 'commondialog',
            'colorchooser'):
    delattr(tkinter, mod)
    del sys.modules['tkinter.' + mod]

Я предполагаю, что это будет работать с более ранними выпусками 3.x, но не устанавливал их для тестирования. Для существующих выпусков 3.6.0a_ замените «colorchooser» на «ttk».

person Terry Jan Reedy    schedule 06.08.2016
comment
Терри, спасибо за поддержку IDLE. Мне очень нравится идея упаковки IDE с языком программирования. Это упрощает развертывание на машинах, на которых вы редко работаете. Удалось ли вам найти решение для использования ЦП, которое я спросил в stackoverflow.com/questions/32551405/ ? Я до сих пор не могу понять, что это за паттерн, который вызывает это, это не происходит постоянно. - person mcu; 06.08.2016
comment
Спасибо за положительный отзыв. - person Terry Jan Reedy; 07.08.2016