基于PyQT6从零开始做一个计时器
作者:微小冷
初步
QT是最流行的跨平台GUI,基于C++开发,pyQT为其python绑定,兼顾了开发效率和运行效率,是Python语言首选GUI框架,支持pip安装
pip install PyQt6
考虑到本系列的主角是PyQT,故后文中如不做特殊说明,QT一律指代PyQT。一个最简单的QT界面如下图所示

代码如下
import PyQt6.QtWidgets as qt
app = qt.QApplication([])
win = qt.QDialog()
win.resize(400,150)
hbox = qt.QHBoxLayout()
btn = qt.QPushButton("点我")
btn.clicked.connect(lambda: qt.QMessageBox.information(
win, "Msg", "你点了我"))
hbox.addWidget(btn)
win.setLayout(hbox)
win.show()
从上述代码可以看到,qt中的函数均以Q开头,然后紧接着是驼峰命名。这种命名规则可以有效避开其他Python模块,所以实际开发时,可直接导入QT组件,后面就不用写qt.xx了。
【QApplication】用于创建一个QT应用,是所有QT代码能够被执行的前提。尽管看上去什么也没做,但必须将其赋给一个变量,以确保其能够在整个GUI生命周期中保持存活。
有了QApp之后,就可以添加布局元素了,包括
- 【QDialog】对话框,也就是我们看到的窗口,通过
resize方法,可以设置窗口的尺寸;setLayout可以添加布局好的内容;show则可弹出窗口。 - 【QHBoxLayout】水平布局管理器,通过
addWidget方法,可以添加控件。 - 【QPushButton】按钮,通过
clicked.connect来绑定回调函数 - 【QMessageBox】中提供了许多消息框,
information为信息框
在实际开发时,往往将窗口写成类,并通过脚本的形式调用,示例如下
import PyQt6.QtWidgets as qt
import sys
class QT1:
def __init__(self):
app = qt.QApplication([])
self.win = qt.QDialog()
self.win.resize(400,150)
hbox = qt.QHBoxLayout()
btn = qt.QPushButton("点我")
btn.clicked.connect(self.show_msg)
hbox.addWidget(btn)
self.win.setLayout(hbox)
self.win.show()
sys.exit(app.exec())
def show_msg(self):
qt.QMessageBox.information(self.win, "信息提示", "你点击了我")
if __name__ == "__main__":
QT1()
和交互式命令行相比,脚本运行QT程序需要在show之后,添加【app.exec()】,以阻塞程序,否则程序会闪退。
导出ui表单
QT提供了非常便捷的拖动式开发工具,只需安装pyside6即可启动。
pip install pyside6 pyside6-designer
进入设计器后,在模板栏选择Main Window,点击创建,即可进入UI拖拽界面

对于这个界面,常年使用C++的同学肯定会感到十分亲切。Ctrl+S快捷键可以保存当前项目,其格式为.ui。这个.ui文件是QT的界面表单,对于C++或者Python都是通用的。
下面设计一个计时器,即从左侧的部件盒子中,拉取一个LCD Number到界面上,用于计时;再拉取两个Push Button作为控制按钮。双击Push Button可以更改按钮上显示的文字,两个按钮分别设为开始和停止。
右侧属性栏中,可以修改部件名称,LCD数字屏保留原始的lcdNumber即可;开始和停止按钮分别设为bnStart和bnStop。
调用
QT设计器的功能仅限于画界面,在导出.ui之后,剩下的工作还是要交给Python。
刚刚我们保存的界面文件名为main.ui,下面在其同级路径下创建python脚本如下
from PyQt6 import uic
from PyQt6.QtWidgets import QApplication, QMainWindow
import sys
class MyWindow(QMainWindow):
def __init__(self):
super().__init__()
uic.loadUi('main.ui', self) # 加载UI文件
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MyWindow()
window.show()
sys.exit(app.exec())
运行这个脚本,即可展现.ui中的规划成果

计时器实现
关于计时器的具体实现流程,主要就是Python的工作了,其运行结果如下

代码如下
import time
from threading import Thread
class MyWindow(QMainWindow):
def __init__(self):
super().__init__()
uic.loadUi('main.ui', self) # 加载UI文件
self.bnStart.clicked.connect(self.bnStart_click)
self.bnStop.clicked.connect(self.bnStop_click)
def timer(self):
t0 = time.time()
while self.isRunning:
dt = time.time() - t0
self.lcdNumber.display(f"{dt:.3f}")
time.sleep(0.1)
def bnStart_click(self):
self.isRunning = True
self.lcdNumber.display("0")
Thread(target = self.timer, daemon=True).start()
def bnStop_click(self):
if self.isRunning:
self.isRunning = False
else:
self.lcdNumber.display("0")
【click】为按钮的点击动作,在QT的对象体系中,是一种信号,是【pyqtBoundSignal】类的具体实现,而非某个某种函数。
【connect】即用于将按钮的点击信号绑定到某个执行函数上。
在QT的术语中,connect绑定的执行函数叫做槽(slot),只不过在pyqt中,不知道slot这个概念也没什么问题。
到此这篇关于基于PyQT6从零开始做一个计时器的文章就介绍到这了,更多相关PyQT6计时器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
