我试图理解我的“main.py”循环是如何工作的。它基于网络上的示例,关于PySide和Qt Designer,用于实现Python GUI。
代码是:
#***********************************#
# Python Libraries #
#***********************************#
from PySide.QtCore import *
from PySide.QtGui import *
import sys
import time
#***********************************#
# Python files #
#***********************************#
import Gui
from server import *
class MainDialog(QDialog, Gui.Ui_TCPServer):
def __init__(self, parent=None):
super(MainDialog, self).__init__(parent)
self.setupUi(self)
self.connect(self.ConnectBt, SIGNAL("clicked()"), self.ConnectBt_clicked)
self.connect(self.QuitBt, SIGNAL("clicked()"), self.QuitBt_clicked)
self.connect(self.DisconnectBt, SIGNAL("clicked()"), self.DisconnectBt_clicked)
print "NOW HERE\r\n"
def ConnectBt_clicked(self):
self.ConnectBt.setText("Connecting...")
self.server_connect()
print "THEN HERE\r\n"
def QuitBt_clicked(self):
self.close()
def DisconnectBt_clicked(self):
self.ConnectBt.setText("Connect")
self.server_off = ChronoRequestHandler()
self.server_off.finish()
def server_connect(self):
self.server_on = ServerStart()
self.server_on.try_connect()
if __name__ == '__main__':
app = QApplication(sys.argv)
form = MainDialog()
print "HERE\r\n"
form.show()
app.exec_()
print "END\r\n"
当我打电话给“main.py”时,我会看到“现在在这里”和“那么在这里”。当我按下'ConnectBt'时,我会得到“那么”的印刷品。
但在此之后,周期仍然存在?它是否会返回 init ,如果是这样,我不应该再次打印“NOW HERE”?它是否会返回主要,如果是这样,我不应该得到“HERE”的印刷品吗?请解释一下......
当我按下'QuitBt'时,我得到了“END”的印刷品......我很困惑!
感谢。
答案 0 :(得分:0)
我认为你应该更清楚地了解对象编程和事件是如何工作的。
在最后一个if语句(从例如终端调用脚本时运行的底部代码)中,您创建了一个QApplication的应用程序对象实例。
之后创建表单,MainDialog的实例,它是您在上面定义的类(从两个类继承方法,属性等,QDialog,Gui.Ui_TCPServer)。
通过
form = MainDialog()
你运行__init__,打印"现在这里"并且走出那个方法。请检查Python中__init__的作用。 why-do-we-use-init-in-python-classes
在结束之前,您调用app实例的exec()方法。它包含一个循环,以便您的界面收集和处理事件。请参阅下面的QApplication.exec()文档。
当您按下“ConnectBt”时,按钮,你调用ConnectBt_clicked()方法,它做东西(连接服务器)并打印"那么这里"。
以同样的方式,当您按下QuitBt时,您调用QuitBt_clicked(),它会关闭连接并让代码打印" END"。
我还建议您阅读有关您正在使用的类的更多文档。他们将解释为什么不同的按钮"链接" /作为回调方法ConnectBt_clicked(),def QuitBt_clicked()和DisconnectBt_clicked()。按钮触发这些回调的机制在这些类中实现的代码中是隐含的。
QApplication Class Reference: exec_
int QApplication.exec_()
进入主事件循环并等待直到调用exit(),然后 返回设置为exit()的值(如果exit()为0则为0) 通过quit()调用。
必须调用此函数才能启动事件处理。该 主事件循环从窗口系统接收事件并发送 这些应用程序小部件。
通常,在调用exec()之前不能进行任何用户交互。 作为一种特殊情况,之前可以使用像QMessageBox这样的模态小部件 调用exec(),因为模态小部件调用exec()来启动本地 事件循环。
使您的应用程序执行空闲处理,即执行a 特殊功能,只要没有待处理事件,请使用QTimer 0超时。可以实现更高级的空闲处理方案 使用processEvents()。
我们建议您将清理代码连接到aboutToQuit() 信号,而不是把它放在你的应用程序的main()函数中。 这是因为,在某些平台上,QApplication.exec()调用可能会 不回来例如,在Windows平台上,当用户登录时 关闭,系统在Qt关闭所有顶级后终止进程 视窗。因此,无法保证应用程序将具有 时间退出事件循环并在main()结束时执行代码 在QApplication.exec()调用之后的函数。
另请参阅quitOnLastWindowClosed,quit(),exit(),processEvents()和 QCoreApplication.exec()。