2016-09-05 3 views
1

Я нашел этот вопрос в долгом, сложном сценарии, но при отладке раздел его до этого очень минимальной формы, которая до сих пор вызывает ту же проблему: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, которая выдает/перезапускает интерпретатор при попытке создать экземпляр любого подкласса и возникла спонтанно там, где раньше не было.

Кто-нибудь видел что-нибудь подобное раньше?

+0

IDLE работает на Tkinter (структура, используемая для создания графических интерфейсов). Вы пытаетесь создать экземпляр объекта window в QT (инфраструктура, используемая для создания графических интерфейсов). Они оба ожидают, что смогут взять на себя управление интерпретатором со своими петлями и крючками для событий - я был бы удивлен, если бы ситуация не пошла * бум *. –

+0

Когда 'Window' подклассифицировано из' QMainWindow', 'Window()' запускает 'QMainWindow .__ init__'. Я подозреваю, что это как-то столкнулось. Посмотрите, делает ли 'QMainWindow()' то же самое. Какая версия x.y.z Python? Были ли старые сценарии запущены с другой версией? Или произошли изменения с той же версией? Что произойдет, если вы отредактируете Lib/idlelib/run.py и закомментируете 'handle_tk_events()', о строке 140 в 'main'? –

+0

@NinjaPuppy Хотя IDLE основан на tk, он обычно запускает код пользователя в отдельном процессе, который не связан непосредственно с tk, за исключением периодического вызова 'tcl.eval (« update »)' wrapped как 'handle_tk'. Когда нет виджетов tk, предполагается, что это нулевая операция. И, по-видимому, раньше был безвреден. Но, возможно, последняя версия tcl/tk изменила это. Или, может быть, что-то изменилось в Python. Или даже в QT5 или PyQT5. –

ответ

0

Спасибо за вашу помощь - насколько я могу судить, на самом деле произошло столкновение между tkinter и Qt. Переустановка моей среды Python, похоже, позаботилась об этой проблеме!

Смежные вопросы