PyQt5的入门到放弃

安装及界面绘制

首先安装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轴刻度范围为010
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,不过这样会大幅度增加程序打开的时间,暂时未找到更好的解决方案

猜你喜欢

转载自www.cnblogs.com/badluckforyou/p/11458077.html