2016-08-15 17 views
5

Tại sao ví dụ dưới đây chỉ hoạt động nếu biến số _ vô ích được tạo?Tại sao tôi cần phải giữ một biến trỏ đến QWidget của tôi?

Biến số _ được chỉ định và không bao giờ được sử dụng. Tôi sẽ giả định một trình biên dịch tốt sẽ tối ưu hóa và thậm chí không tạo ra nó, thay vào đó nó làm cho một sự khác biệt.

Nếu tôi xóa _ = và để lại chỉ Test(), thì cửa sổ được tạo, nhưng nó nhấp nháy và biến mất ngay lập tức và python bị treo vĩnh viễn.

Đây là mã:

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

Bạn có nghĩa là 'Test()' thay vì 'Example()'? –

+4

Nếu một đối tượng Python không được tham chiếu, nó là rác được thu thập, điều này sẽ giải thích tại sao cửa sổ nhấp nháy sau đó biến mất. –

+1

Vì vậy, một biến mà chương trình của bạn sẽ không hoạt động mà không có "vô dụng"? – kindall

Trả lời

3

Đó là một câu hỏi rất tốt và tôi đã phải đối mặt với rất nhiều vấn đề lạ trong quá khứ vì thực tế này với các widget PyQt và plugins của tôi, về cơ bản điều đó xảy ra nhờ số python garbage collector.

Khi bạn gán thể hiện của mình cho biến số _ giả trước khi nhập vòng lặp chính của Qt, sẽ có một tham chiếu sống sẽ tránh được bộ thu gom rác thu thập, do đó tiện ích sẽ không bị hủy.

+0

Điều đó có nghĩa là nếu tôi muốn tạo cửa sổ bên trong một phương thức của một đối tượng không toàn cầu, thì cửa sổ sẽ bị hủy ngay khi đối tượng nằm ngoài phạm vi? Và nếu tôi muốn (tôi không biết vì lý do gì) tôi sẽ cần phải gán nó cho một biến toàn cầu? – stenci

+0

Vâng, đó chính là ý nghĩa của nó. –

0

@BPL là chính xác nhưng tôi muốn thêm rằng bạn không phải gán nó cho _. Bạn có thể gán nó cho bất kỳ biến nào bạn thích. Bạn chỉ cần một biến tham chiếu đến đối tượng bạn đã tạo, nếu không nó được thu thập bởi bộ thu gom rác sau khi được tạo.

Các vấn đề liên quan