安装及界面绘制
首先安装pyqt5及pyqt5tools,使用豆瓣源
pip install pyqt5 -i https://pypi.doubanio.com/simple/
pip install pyqt5-tools -i https://pypi.doubanio.com/simple/
在安装完成后,通过Qt Designer创建自己想要的界面,创建完成后在ui文件所在路径通过cmd执行
pyuic5 -o mainpage.py mainpage.ui
将mainpage转换为py文件
py文件内容为:
class Ui_mainpage(object):
def setupUi(self, mainpage):
...
再创建一个新的py文件,如main.py去调用该界面文件
新py文件内容如下:
class main(QmainWindow, Ui_mainpage):
def __init__(self, parent=None):
super().__init__()
...
pyqt的一些常用代码
设置界面电脑屏幕居中
def center_setting(self):
'''居中显示'''
screen = QDesktopWidget().screenGeometry()
size = self.geometry()
w = (screen.width() - size.width()) / 2
h = (screen.height() - size.height()) / 2
self.move(w, h)
设置界面图标,该方法在将脚本生成为exe后,仍然需要在exe所在文件夹下放置图标,否则图标会失效
def icon_setting(self):
self.setWindowIcon(QIcon('xxx.ico'))
设置界面大小为固定值,且不可改动,如伸缩、最大
def windowsize_setting(self):
'''不可调整大小'''
self.setFixedSize(1190, 615)
设置背景颜色或图片,生成为exe后,图片仍需像icon图标一样处理
def background_setting(self):
'''背景颜色或图片'''
bg = QtGui.QPalette()
# 背景颜色
bg.setColor(self.backgroundRole(), QColor(248, 248, 255))
# 背景图片
# bg.setBrush(self.backgroundRole(), QtGui.QBrush(QtGui.QPixmap('')))
self.setPalette(bg)
self.setAutoFillBackground(True)
pyqtSlot()修饰器可以将按钮操作直接定义为一个方法,如下,名为buttonname的按钮在被点击后,会执行...中的代码
@pyqtSlot()
def on_buttonname_clicked(self):
...
下拉框添加数据及点击对应下拉框选项的信号发射
# 如果获得的数据是列表
if isinstance(namelist, list):
self.drop_down_box.addItems(namelist)
# 如果获得的数据非列表
if isinstance(name, str):
self.drop_down_box.addItem(name)
# 选中某个下拉框选项时,发射该信号去执行new_func方法
self.drop_down_box.connect(self.new_func)
def new_func(self, i):
# i为被选中的值
...
QMessageBox提示框,个人比较喜欢这个提示框,主要是代码量少,下图为其表现
def operation_fail(self, txt):
'''操作失败提示'''
notice = QMessageBox.about(self, '提示', txt)
绘制线形图
使用的库为pyqtgraph
pyqtgraph如果想去了解,可直接用以下代码唤起其演示界面,其常用代码均可在该界面上找到
import pyqtgraph.explames as pg_e
pg_e.run()
因为没有设计'展示鼠标所在点的坐标'的功能,所以绘制线形图使用GraphicsLayoutWidget,其实现原理,简单来说就是给一个列表,然后直接把列表数据刷在界面上,各种数据点直接用线连起来
首先需要在Qt Designer中生成对应控件,Qt Designer无法直接创建GraphicsLayoutWidget,首先需要创建一个Widget,再将其提升为GraphicsLayoutWidget,具体如下:
GraphicsLayoutWidget控件的一些基本设置
import pyqtgraph as pg
def glw_setting(self):
'''GraphicsLayoutWidget控件的背景、线条设置,需要在setupUi前执行'''
# 控件的背景颜色
pg.setConfigOption('background', (248, 248, 255))
# 线条的颜色
pg.setConfigOption('foreground', 'k')
# 启用抗锯齿( 让曲线更加光滑)
pg.setConfigOptions(antialias=True)
def _glw_setting(self):
'''GraphicsLayoutWidget控件的部分设置,需要在setupUi后设置'''
# 设置标题
cpu = self.glwname.addPlot(title="xxx")
# 设置x轴刻度范围为0到10
cpu.setXRange(0, 10, padding=0)
# 设置y轴刻度
cpu.setYRange(0, 10, padding=0)
绘制代码如下
def glwname_show_on_layout(self):
mylist = list(range(1,100))
# 绘制前先清空下,以免有旧数据
self.glwname.clear()
_glw = self.glwname.addPlot(title='xxx')
# 绘制线形图
_glw.plot(y=mylist, pen=pg.mkPen((0, 0, 0), width=0.8))
通过线程让界面数据显示变为可控
使用QThread
class mythread(QThread):
mysignal = pyqtSignal(int)
def run(self):
'''函数名必须命名为run'''
status = True
while status:
...
result = get_your_result()
# 发送信号
self.mysignal.emit(result)
# 控制循环状态
status = test.get_loop_status()
然后在main.py的main类中添加对应的处理
在你觉得合适的地方构建两者的关联,以下代码在main.py的main类中编写
self.myTh = mythread()
self.myTh.mysignal.connect(self.my_func)
def my_func(self):
# 收到对应信号后即会开始执行下方函数
self.glwname_show_on_layout()
想要让线程开始,可以通过按钮去start线程
@pyqtSlot()
def on_startbutton_clicked(self):
test.set_loop_status(True)
self.myTh.start()
想要结束线程,也可以通过按钮去关闭
@pyqtSlot()
def on_stopbutton_clicked(self):
test.set_loop_status(False)
self.myTh.quit()
小结
总得来说,pyQt用来创建桌面程序整体来说还算合格,但实际上过于鸡肋,因此建议只是了解,无需深究
以上仅为个人愚见,如有冒犯,还请见谅
以下即为通过pyQt实现的程序
附:如何用python进行exe打包
首先安装pyinstaller
在脚本所在目录cmd执行
pyinstaller -F -i 图标 -w 主文件 -p 关联文件1 -p 关联文件2 -p 关联文件3 #此指令生成的exe无cmd
pyinstaller -F -i 图标 -c 主文件 -p 关联文件1 -p 关联文件2 -p 关联文件3 #此指令生成的exe带cmd
如果遇到生成单个无cmd的exe,运行exe后无法调用到计算机cmd情况,请生成自带cmd的exe,不过这样会大幅度增加程序打开的时间,暂时未找到更好的解决方案