PyQt:app.exec_()停止运行以下所有代码

时间:2014-04-17 20:21:53

标签: python pyqt pyqt4

我的代码如下:

app = QApplication(sys.argv)
self.interface = Interface()

# The figure
self.fig = self.interface.fig
self.ax = self.fig.add_subplot(111)

self.interface.show()
app.exec_()

print 'this is not printed'

问题是一旦app.exec_()被执行,在我关闭弹出的窗口之前什么都没有。

如何继续运行代码?

4 个答案:

答案 0 :(得分:11)

这是有目的的。您需要做的是在调用app.exec()之前使用信号/插槽,Qt类中的代码,或者生成线程。

信号和插槽是你与Qt互动的真实方式。基本上信号是任何事件"或定制"事件"和插槽可以被认为是"事件处理程序"。例如,当有人点击GUI上的按钮时,它会创建一个信号,找出与其连接的任何处理程序。您可以将无,一个或多个插槽连接到每个信号(您甚至可以多次连接相同的插槽)! Here is a good reference在python中为此。

在Qt类中编码通常意味着创建为您做有用工作的插槽。请记住,您不希望将事件循环拖得太长,以便在执行此操作时生成新线程。

您可以使用的第三个选项是分离其他线程。小心与线程中的Qt交互,如果你这样做,你必须使用信号和插槽。将线程实现为suggested in this SO

答案 1 :(得分:4)

app.exec_()没有锁定任何东西,它运行一个GUI事件循环,等待用户操作(事件)并将它们分派到正确的小部件进行处理。这样做直到没有顶层窗户打开;如果您打开应用程序的至少一个顶级窗口,则exec()永远不会返回,它不能(您的应用程序将在系统关闭期间终止)。当没有更多顶级窗口时,应用会清理并从exec()返回。此时,GUI不再处于事件循环中。

无论你想在exec()之后做什么,你可能会把它放在QThread或信号处理程序中(例如,你可以将它连接到" Go!& #34;按钮;您可以将"取消"按钮连接到关闭应用程序窗口的处理程序。

你可以把代码放在exec()之后但是它会非常传统:如果出现任何问题,用户不太可能看到问题,因为GUI不再可见,GUI应用程序通常不会打开控制台终端可能会看到错误,通常不会有GUI应用程序的控制台(即您将通过pythonw.exe而不是python.exe运行应用程序),或者您必须打开一个新窗口和exec()再次显示错误消息并等待用户单击确定,在ok处理程序中销毁消息窗口,以便app.exec()再次返回。

答案 2 :(得分:4)

除了上一个答案之外,并非每次关闭所有窗口时,由app.exec_()运行的GUI事件循环都会停止。如果要手动终止它,可以在任何事件处理程序中使用app.quit()。它会停止GUI事件循环并在app.exec_()之后启动代码。

第一个答案是关于一无所获的很多话。

答案 3 :(得分:0)

删除阻塞的肮脏技巧是滥用mathplot lib:

import matplotlib
import matplotlib as mpl

import matplotlib.cbook as cbook
import matplotlib.collections as mcol
import matplotlib.patches as mpatches
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt
import matplotlib.cm as cm       # colors 
from   mpl_toolkits.mplot3d import Axes3D   # imports options for 3-D plotting
from   matplotlib.backends.backend_pdf import PdfPages

from PyQt5 import QtWidgets, uic
# ============================================================== 
if not QtWidgets.QApplication.instance():
    app = QtWidgets.QApplication(sys.argv)
else:
    app = QtWidgets.QApplication.instance() 
#endelse

MainWindow =  QtWidgets.QMainWindow()
MainWindow=uic.loadUi('E:\Python\Python_lib\MyGui.ui',MainWindow)
MainWindow.show()

# There are two ways to start the gui, and i.e. it looping 
# The correct way if to use app.exec_(), which 
# blocks the command line :


#d=app.exec_()

# However, this will block the command line making 
# We can misuse mathplot lib creating a Figure instead
# which seems to start the Gui loop without blocking the command line: 

ImageFig = Figure((3,4))
ImagePanel = FigureCanvas(ImageFig)
ImagePanel.draw()