2016-08-15 17 views
5

Dlaczego poniższy przykład działa tylko wtedy, gdy tworzona jest niepotrzebna zmienna _?Dlaczego muszę zachować zmienną wskazującą na moją QWidget?

Zmienna _ jest przypisana i nigdy nie jest używana. Zakładam, że dobry kompilator zoptymalizuje, a nawet go nie stworzy, zamiast tego robi różnicę.

Po usunięciu _ = i pozostawieniu tylko Test(), zostanie utworzone okno, ale miga ono i znika natychmiast, a pyton zawiesza się na zawsze.

Oto kod:

import sys 
from PyQt4 import QtGui 

class Test(QtGui.QWidget): 
    def __init__(self): 
     super().__init__() 
     self.show() 

app = QtGui.QApplication(sys.argv) 
_ = Test() 
sys.exit(app.exec_()) 
+5

Masz na myśli 'Test()' zamiast 'Przykład()'? –

+4

Jeśli obiekt w języku Python nie jest odwoływany, jest to kolekcja śmieci, która wyjaśniałaby, dlaczego okno migocze, a następnie znika. –

+1

A zatem zmienna, której program nie będzie działał bez użycia, jest "bezużyteczna"? – kindall

Odpowiedz

3

To bardzo dobre pytanie i mam do czynienia wiele dziwnych problemów w przeszłości z powodu tego faktu z moich widżetów PyQt i wtyczek, w zasadzie, co dzieje się dzięki python garbage collector.

Po przypisaniu swojej instancji do tej zmiennej obojętnej _ przed wejściem do głównej pętli Qt, pojawi się żywe odniesienie, które będzie unikane do zbierania przez garbage collector, dlatego widget nie zostanie zniszczony.

+0

Czy to oznacza, że ​​jeśli chcę utworzyć okno wewnątrz metody obiektu nieglobalnego, to okno zostanie zniszczone, gdy tylko obiekt znajdzie się poza zasięgiem? A gdybym chciał (nie wiem z jakiego powodu), musiałbym przypisać ją do zmiennej globalnej? – stenci

+0

Tak, właśnie to oznacza. –

0

@ BPL jest poprawny, ale chciałem dodać, że nie trzeba go przypisywać do _. Możesz go przypisać do dowolnej zmiennej, którą lubisz. Potrzebna jest tylko zmienna odnosząca się do utworzonego obiektu, w przeciwnym razie zostanie zebrana przez moduł do zbierania śmieci po utworzeniu.