擅长:python、mysql、java
<p>首先,从外观上看,您的代码包含一个语法错误,这是由于不一致的缩进造成的,这是python中的一个问题。在</p>
<p>更重要的是,在execute方法中创建了一个本地对象,一旦方法完成,本地创建的对象就会被销毁。在</p>
<p>这是因为qwidgets的show()方法没有阻塞。当事件循环可用时,它们将只为Qt事件循环排队以处理请求。在</p>
<p>您可以将变量类的作用域设置为MainWindow,但随后可以将创建TaskWindow的创建移动到init方法,以避免每次发出信号时不必要的对象创建,并且您将只在execute方法中显示TaskWindow,如下所示:</p>
<pre><code>def __init__(self, parent = None):
super(MainWindow, self).__init__(parent)
...
self.execTaskAct = QtGui.QAction("execute", self, triggered=self.executeTask)
...
self.task = TaskWindow()
def executeTask(self):
task.show()
</code></pre>
<p>如果您真的希望每次触发执行时都构造一个新对象,那么您可以在前面加上“self”关键字,使每个新创建的对象类都具有作用域。但是,请确保不要在未定义的行为中留下未引用的窗口。所以,你可以这样写:</p>
^{pr2}$
<p>当然,您需要从TaskWindow的init方法中删除show()调用。在</p>
<p>也就是说,为了完整起见,我还将为TaskWindow分配一个父级,无论是主窗口还是应用程序对象本身。在</p>
<pre><code>self.task = TaskWindow(self)
</code></pre>
<p>另外请注意,如果您只想看到一个窗口,您可能希望通过调用主窗口的hide()方法来隐藏主窗口。如果希望同时显示这两个窗口,可以考虑使用TaskDialog而不是两个MainWindow。在</p>
<p>此外,一旦完成执行,如果用户不希望显式关闭TaskWindow,则可能希望显式地hide()。这取决于你的用例。在</p>