赞
踩
本篇文章主要记录使用 Qt Designer来制作PyQt5的GUI界面模板,然后编写相应的python代码来实现其功能
PyQt5 是一个用于创建图形用户界面 (GUI) 应用程序的 Python 模块。它是 PyQt 库的最新版本,基于 Qt 库,提供了丰富的 GUI 组件和工具,可以帮助开发人员快速地创建跨平台的桌面应用程序。
Qt Designer 是一个用于创建和编辑 Qt 用户界面的可视化设计工具。它是 Qt 工具集中的一部分,可以通过 Qt Creator 或者独立运行来使用。
使用 Qt Designer,你可以通过拖放和选择 UI 组件来快速地设计和布局用户界面。这些组件包括按钮、文本框、标签、菜单等。在设计过程中,你可以随时预览实际效果,修改并调整组件属性、样式和布局。此外,你还可以在 Qt Designer 中添加自定义控件或者代码片段,以满足自己的需求。
我们使用pip来安装PyQt5:
pip install PyQt5
我们使用pip来安装PyQt5-Tools:
pip install PyQt5
当然,这样安装的速度会非常的慢,
这时我们使用-i指定豆瓣镜像来快速安装:
-i https://pypi.douban.com/simple
安装好之后我们可以在python的根目录搜索designer.exe
,如图:
我们新建快捷方式到桌面,就可以方便使用了。
我们进入到designer.exe后可以看到如图所示的界面:
我们选择Main Window
,来创建一个窗口项目,如图所示:
我们大致将该程序界面分为三个区域:控件区、窗口展示区、参数查看修改区,也就是用红边框标记的区域。
添加控件
我们只需要在控件选择区选择一个控件将其拖拽至窗口中的指定位置即可。比如我们先来选择一个button控件将其添加至窗口,如图所示:
这样就实现了控件的添加。
属性的修改
我们可以双击该控件来修改其文本属性
当然,我们也可以选择修改右边区域的文本属性的参数,如图所示:
到这里,我们基本上就可以实现制作任意类型的窗口界面了,也是非常的简单。
窗口界面做的再精致又能怎么样?说罢了就是一个摆设,我们最终还得给它添加功能,实现它的作用。
本次我们就实现一个简单的功能作为示例:点击按钮输出1-100之内的数值,每个0.1秒输出一个,并且显示进度条。
*1、*首先将窗口拉小,并添加文本框,以及进度条:
*2、*将文件保存至自定义目录,我们会看到一个以.ui
结尾的文件、
*3、*在文件的根目录下键入命令:pyuic5 -o ui.py untitled.ui
该命令的作用是将指定的ui文件转换输出为一个py文件
-o py_file ui_file
指定将一个ui文件输出为一个py文件
效果如图所示:
*4、*我们再创建一个outnum.py
文件。
*5、*然后我们打开ui.ui
这个py文件来看看源代码:
可以看到,这是用PyQt5写的界面模板。
*6、*然后我们在outnum.py文件中添加代码来引用该界面模板添加相应的功能:
import sys,time from ui import Ui_MainWindow from PyQt5.QtWidgets import QMainWindow,QApplication from PyQt5.QtCore import QTimer class Mywin(QMainWindow,Ui_MainWindow): def __init__(self): super(Mywin,self).__init__() self.setupUi(self) self.pushButton.clicked.connect(self.num_show) def num_show(self): self.qtime = QTimer() self.qtime.timeout.connect(self.show_num) self.qtime.start(100) def show_num(self): a = self.progressBar.value()+1 self.progressBar.setProperty("value",a) self.textBrowser.insertPlainText(str(a)+"\r\n") if a == 100: self.qtime.stop() self.progressBar.setProperty("value",100) app = QApplication(sys.argv) mywin = Mywin() mywin.show() sys.exit(app.exec_())
效果如图所示:
我们会发现,每隔0.1秒就会有一个数字打印,直到打印到100
注意:当我们再次点击按钮时就会循环打印101,这时我们可以添加一个重置清除按钮,编写对应的重置清除方法来实现功能。这个时候我们不要去改ui.py
文件,只需将.ui
文件拖拽至Qt Designer程序添加控件然后保存之后键入转换为.py
文件的命令覆盖掉之前的py模板文件即可。
我们先来解释以下这些代码:
我们首先导入了一些所需模块:ui、PyQt5.QtWidgets、PyQt5.QtCore,可以看到ui是我们的界面模板。
然后定义了一个Mywin类,这个类继承了QMainWindow
、Ui_MainWindow
。
然后我们在初始化方法__init__
中使用了super(Mywin, self).__init__()
调用了父类 (即 QMainWindow) 的__init__()方法
,确保正确地初始化了父类的属性和方法。这是为了避免子类和父类之间出现命名冲突等问题。
在num_show(self)
方法中,我们使用了PyQt5中的计时器:QTimer()
来实现按时打印数字。通过self.qtime.timeout.connect(self.show_num)
连接打印功能的方法,通过self.qtime.start(100)
来按时触发该定时器。
可以看到show_num(self)
这个方法就是实现打印数字的功能,每次触发定时器时都会让a加上进度条的进度,然后更新进度条,打印a这个数字在文本框,当触发定时器一直到a的值为100,则停止该定时器。
其实在show_num(self)
这个方法中我开始是这样写的:
def num_show(self):
a = 0
for i in range(101):
self.progressBar.setProperty("value", i)
self.textBrowser.insertPlainText(str(i)+"\r\n")
time.sleep(0.1)
self.progressBar.setProperty("value", 100)
结果就是,程序打印数字运行一段时间打了一些数字之后就会卡住,然后就把剩余数字一瞬间全打出来
这是因为 num_show()
函数中使用了 time.sleep(0.1) 的方法,导致程序会暂停 100ms 才能执行下一次循环。而在 PyQt5 中,事件循环 (event loop) 是非常重要的,它负责接收、分发和处理所有事件,包括鼠标点击、键盘输入等用户交互事件。当使用 time.sleep() 这样阻塞式的操作时,事件循环也会被挂起,无法响应其他事件。这就是为什么程序会卡住,直到循环结束后才会一次性将数字全打出来。
所以改进后的代码我改成了使用定时器来完成该操作。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。