开发桌面软件,当然最牛逼的是QT。然而QT是基于C++的,C++是一种专业性极强的语言,业余玩家很难掌握。QT并没有放弃大部分业余玩家,他们做了PyQt和PySide两个包,让广大python玩家也可以用python语言来玩QT。
因为PyQt的开源策略没有PySide幅度大,不能做闭源软件,今天我们用PySide来做一个小项目,体验一下PySide。我这个人喜欢用最新的版本,于是选择的是PySide6。
第一步:安装PySide6
安装PySide6很简单,直接在终端执行:pip install PySide
如果你有使用 pycharm ,那么安装就更简单了,直接按照提示进行就可以了。
具体怎么安装就不详细说了,如果有什么问题可以在评论区讨论。
第二步:需求分析
如题所述,我们要做一个秒表。最简单的秒表是这样的,有一个界面,界面上有一个显示数字的地方,有两个按钮,一个是开始,一个是暂停。
基础知识回顾,老司机可以跳过。计算机显示一个界面,是不断地由上而下的刷新当前界面,因为这种刷新非常快,我们就会觉得界面是固定的。如果界面的部分地方发生了改变,比如按钮状态变成了不可操作,也是可以通过这种刷新来修改的。如果修改某个地方需要比较长的时间,那么界面就会卡顿,卡顿时间就是修改某个地方所需要的时间。为了界面的流畅,所以我们就要用子线程来操作一些比较耗时的操作。
第三步:实现逻辑
点击“开始”按钮,启动一个线程,这个线程会对一个数字n进行每秒加一的操作,操作完后会把这个数字传递给主界面,然后在主界面上显示出来。
点击“暂停”按钮,关闭线程,系统停止对n进行加一操作。再次点击“开始”,又启动线程,继续对n进行加一操作。
n这个数字是主界面上用来显示的数字,点击“开始”按钮时,要把这个数字传递给子线程,子线程每进行一次加一操作,就把n还给主界面,并修改主界面的数字,这样就实现了主界面秒表读数的效果。
第四步:代码实现
子线程向主线程传递数据,用Signal(),显示数字用QLCDNumber(),按钮用QPushButton(),子线程用QThread()(创建一个类继承它即可)。直接上代码:
import sys
import time
from PySide6.QtWidgets import *
from PySide6.QtCore import *
class Form(QDialog):
def __init__(self, parent=None):
super(Form, self).__init__(parent)
self.setWindowTitle("秒表")
self.resize(500,300)
self.n=0 #用来显示的数字
self.led=QLCDNumber(self)
self.led.resize(100,50)
self.led.move(int(self.width()/2-self.led.width()/2),10)
self.led.display(0)
self.ok_button=QPushButton("确定",self)
self.ok_button.resize(100,50)
self.ok_button.move(int(self.width()/2-self.ok_button.width()/2),self.led.height()+30)
self.ok_button.clicked.connect(lambda:self.start())#触发开始函数
self.stop_button=QPushButton("暂停",self)
self.stop_button.resize(100,50)
self.stop_button.move(self.ok_button.x(),self.ok_button.y()+40)
self.stop_button.clicked.connect(lambda:self.stop()) #触发暂停函数
def start(self):
self.ok_button.setEnabled(False)
self.stop_button.setEnabled(True)
self.th = Myth(self.n) #创建子线程 并向子线程传入self.n
self.th.signalA.connect(self.change) #链接信号到槽函数
self.th.start()
def stop(self):
self.stop_button.setEnabled(False)
self.ok_button.setEnabled(True)
self.th.stop()
def change(self,msg):#接受来自子线程的信号msg
print("msg=",msg)
self.n=msg
self.led.display(self.n) #用来自子线程的数字修改主界面的显示数字
class Myth(QThread):
signalA=Signal(int)
def __init__(self,n):
super(Myth,self).__init__()
self.n=n
self.ok=None
def __del__(self):
self.wait()
def stop(self):
self.ok=False
def run(self):
self.ok = True
while self.ok:
self.n=self.n+1 #给self.n加一操作
print(self.n)
self.signalA.emit(self.n)
time.sleep(1) #等待一秒钟
if __name__ == '__main__':
# Create the Qt Application
app = QApplication(sys.argv)
# Create and show the form
form = Form()
form.show()
# Run the main Qt loop
sys.exit(app.exec())
第五步:效果展示
视频效果:
视频加载中…