2016-09-05 6 views
1

Ich stelle dieses Problem in einem langen, komplexen Skript, aber während es das Debuggen gestrippt auf diese sehr minimal Form des immer noch das gleiche Problem verursacht:Python Subklassifizieren verursacht IDLE neu zu starten

from PyQt5.QtWidgets import(QMainWindow) 

class Window(QMainWindow): 
    pass 

Wenn ich importiere diese Klasse durch den IDLE-Interpreter, dann versuchen, die Klasse mit

w = Window() 

die Shell neu gestartet wird mit einem instanziiert "========== NEUSTART: Shell ===========" Botschaft.

Solches das Problem zu beheben:

from PyQt5.QtWidgets import(QMainWindow) 

class Window: 
    pass 
  • Ausführen des Codes außerhalb des IDLE durch einen Doppelklick auf die Datei, wenn:

    • den Code Umschreiben, so dass die Window-Klasse keine Superklasse es hat einen "if name == 'main':" bedingt hinzugefügt

    Diese Dinge nicht das Problem zu beheben:

    • den Namen der Klasse ändern
    • die Klasse als Super

    das entscheidende Argument wird verwendet, ändern, wenn ich zurück gehen und versuchen, um ähnlich unterklassierte Klassen aus alten Skripten zu importieren/instanziieren, die in der Vergangenheit gut funktionierten und seit einiger Zeit nicht mehr berührt wurden, zeigen sie nun genau das gleiche Problem.

    Also, soweit ich das beurteilen kann, habe ich ein IDLE-spezifisches Problem, das den Interpreter abstürzt/neu startet, wenn er versucht, irgendeine Unterklasse zu instanziieren, und die spontan entstand, wo sie vorher nicht vorhanden war.

    Hat jemand schon einmal so etwas gesehen?

  • +0

    IDLE läuft auf Tkinter (ein Framework zum Erstellen von GUIs). Sie versuchen, eine Instanz eines Fensterobjekts in QT (einem Framework zum Erstellen von GUIs) zu erstellen. Beide erwarten, dass sie mit ihren eigenen Event-Loops und Hooks die Kontrolle über den Interpreter übernehmen können - ich wäre überrascht, wenn die Dinge nicht gehen würden * boom *. –

    +0

    Wenn 'Window' von' QMainWindow' subclassiert wird, führt 'Window() '' 'QMainWindow .__ init__' aus. Ich vermute, dass das irgendwie zusammenstößt. Sehen Sie, ob 'QMainWindow()' das gleiche tut. Was genau x.y.z Python-Version? Wurden alte Skripte mit einer anderen Version ausgeführt? Oder ist mit der gleichen Version etwas passiert? Was passiert, wenn Sie Lib/idleLib/run.py editieren und 'handle_tk_events()', über Zeile 140 in der 'main' Funktion auskommentieren? –

    +0

    @NinjaPuppy Während IDLE auf tk basiert, führt es normalerweise Benutzercode in einem separaten Prozess aus, der tk nicht direkt betrifft, mit Ausnahme eines periodischen Aufrufs von 'tcl.eval (" update ")' als 'handle_tk' umgebrochen. Wenn es keine tk-Widgets gibt, sollte dies eine Null-Operation sein. Und war anscheinend vorher harmlos. Aber vielleicht hat die neueste Version von tcl/tk das geändert. Oder vielleicht hat sich in Python etwas geändert. Oder sogar in QT5 oder PyQT5. –

    Antwort

    0

    Danke für Ihre Hilfe - soweit ich das beurteilen kann, gab es tatsächlich einen Konflikt zwischen Tkinter und Qt. Eine Neuinstallation meiner Python-Umgebung scheint sich um das Problem gekümmert zu haben!