Я нашел этот вопрос в долгом, сложном сценарии, но при отладке раздел его до этого очень минимальной формы, которая до сих пор вызывает ту же проблему:Python подклассы вызывает IDLE перезапустить
from PyQt5.QtWidgets import(QMainWindow)
class Window(QMainWindow):
pass
Когда я импортировать этот класс через IDLE переводчика, а затем попытаться создать экземпляр класса с
w = Window()
перезапуска оболочки с "========== RESTART: Shell ===========" сообщение.
Эти вещи исправить эту проблему:
переписывания кода, так что класс окна не имеет суперкласса:
from PyQt5.QtWidgets import(QMainWindow) class Window: pass
Запуск кода вне IDLE, дважды щелкнув файл, когда он имеет «если имя ==« основное »:« условное добавление
Эти вещи не решить эту проблему:
- Изменение имени класса
- Изменение класса, используемого в качестве супер
решающим аргументом является то, что, когда я иду назад и попробовать для импорта/создания аналогичных классов подкласса из старых сценариев, которые отлично работали в прошлом и не были затронуты через некоторое время, теперь они показывают точно такую же проблему.
Итак, насколько я могу судить, у меня есть проблема, связанная с IDLE, которая выдает/перезапускает интерпретатор при попытке создать экземпляр любого подкласса и возникла спонтанно там, где раньше не было.
Кто-нибудь видел что-нибудь подобное раньше?
IDLE работает на Tkinter (структура, используемая для создания графических интерфейсов). Вы пытаетесь создать экземпляр объекта window в QT (инфраструктура, используемая для создания графических интерфейсов). Они оба ожидают, что смогут взять на себя управление интерпретатором со своими петлями и крючками для событий - я был бы удивлен, если бы ситуация не пошла * бум *. –
Когда 'Window' подклассифицировано из' QMainWindow', 'Window()' запускает 'QMainWindow .__ init__'. Я подозреваю, что это как-то столкнулось. Посмотрите, делает ли 'QMainWindow()' то же самое. Какая версия x.y.z Python? Были ли старые сценарии запущены с другой версией? Или произошли изменения с той же версией? Что произойдет, если вы отредактируете Lib/idlelib/run.py и закомментируете 'handle_tk_events()', о строке 140 в 'main'? –
@NinjaPuppy Хотя IDLE основан на tk, он обычно запускает код пользователя в отдельном процессе, который не связан непосредственно с tk, за исключением периодического вызова 'tcl.eval (« update »)' wrapped как 'handle_tk'. Когда нет виджетов tk, предполагается, что это нулевая операция. И, по-видимому, раньше был безвреден. Но, возможно, последняя версия tcl/tk изменила это. Или, может быть, что-то изменилось в Python. Или даже в QT5 или PyQT5. –