Python基础之用PyQt5界面代码分离以及自定义一个槽函数
最近开发一个项目,需要用到界面,遇到界面不能实时更新的问题,看到网上很多用槽函数,但是大多都是些button的,并不是我需要的,要么就是整数的,后来自己进行尝试,写了一个自定义的槽函数处理treewidget,特地分享出来。
背景:用QT Designer设计了一个界面,在程序运行中间调用界面,并随着程序的运行会更新treewidget。
问题1:如果在界面Class中写运行程序,那么结果会等到程序运行结束,最后界面出来,但是此时界面上已经是最终结果
解答:因为会等到程序结束才会加入界面mainloop中,执行到最后一句话,界面才会显示,所以解决办法就是将中间需要处理的代码放到线程中,这样就不会妨碍程序往下走了。
问题二:在线程中代码会需要更新界面,但是界面往往卡顿,只有鼠标点cmd窗口,在点回界面时,数据才刷新,不能更好的看到程序运行的结果。
解答:PyQt5中不友好支持子线程中对界面的设置,需要使用槽函数,信号触发的方式来更新界面。
为了更好的演示,这里先介绍一下把界面和代码分离的方法
现在开始自定义槽函数。
先看分离后的函数:
treeview4_test.py
from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog
from PyQt5 import QtCore, QtGui, QtWidgets
import treeview4
import treeview_data
import sys class MainCode(QMainWindow, treeview4.Ui_MainWindow): def __init__(self):
QMainWindow.__init__(self)
treeview4.Ui_MainWindow.__init__(self)
self.setupUi(self)
# 设置列宽
self.treeWidget.setColumnWidth(0, 200) _translate = QtCore.QCoreApplication.translate
self.initial_tree_view(_translate)
self.treeWidget.expandAll() def initial_tree_view(self, _translate):
list_objects = []
test1 = treeview_data.DataCollection()
test1.set_module({"Test1": "waiting"})
test1.add_item({"a1": "waiting"})
test1.add_item({"b1": "waiting"})
test1.add_item({"c1": "waiting"})
list_objects.append(test1) test2 = treeview_data.DataCollection()
test2.set_module({"Test2": "waiting"})
test2.add_item({"a2": "waiting"})
test2.add_item({"b2": "waiting"})
test2.add_item({"c2": "waiting"})
test2.add_item({"d2": "waiting"})
list_objects.append(test2) test3 = treeview_data.DataCollection()
test3.set_module({"Test3": "waiting"})
test3.add_item({"a2": "waiting"})
test3.add_item({"b2": "waiting"})
test3.add_item({"c2": "waiting"})
test3.add_item({"d2": "waiting"})
list_objects.append(test3) for object_num, object_module in enumerate(list_objects):
item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget)
brush = QtGui.QBrush(QtGui.QColor(176, 165, 172))
brush.setStyle(QtCore.Qt.SolidPattern)
item_0.setBackground(0, brush)
for module_name, module_result in object_module.module.items():
brush = QtGui.QBrush(QtGui.QColor(0, 255, 0))
brush.setStyle(QtCore.Qt.SolidPattern)
item_0.setBackground(1, brush)
self.treeWidget.topLevelItem(object_num).setText(0, _translate("MainWindow", module_name))
self.treeWidget.topLevelItem(object_num).setText(1, _translate("MainWindow", module_result))
for item_num, item_dic in enumerate(object_module.items):
for item_name, item_result in item_dic.items():
item_1 = QtWidgets.QTreeWidgetItem(item_0)
self.treeWidget.topLevelItem(object_num).child(item_num).setText(0, _translate("MainWindow",
item_name))
self.treeWidget.topLevelItem(object_num).child(item_num).setText(1, _translate("MainWindow",
item_result)) if __name__ == "__main__":
app = QApplication(sys.argv)
md = MainCode()
md.show()
app.exec_()
# sys.exit(app.exec_())
然后调用子线程进行刷新:
from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog
from PyQt5 import QtCore, QtGui, QtWidgets
import treeview4
import treeview_data
import sys
import threading
import time class MainCode(QMainWindow, treeview4.Ui_MainWindow):
list_result_update = QtCore.pyqtSignal([int, int, str]) def __init__(self):
QMainWindow.__init__(self)
treeview4.Ui_MainWindow.__init__(self)
self.setupUi(self)
# 设置列宽
self.treeWidget.setColumnWidth(0, 200) _translate = QtCore.QCoreApplication.translate
self.initial_tree_view(_translate)
self.treeWidget.expandAll()
# 用列表触发槽函数
self.list_result_update.connect(self.modified_treewidget)
# 线程函数
self.run() def run(self):
th = threading.Thread(target=self.go_update)
th.setDaemon(True)
th.start() def initial_tree_view(self, _translate):
list_objects = []
test1 = treeview_data.DataCollection()
test1.set_module({"Test1": "waiting"})
test1.add_item({"a1": "waiting"})
test1.add_item({"b1": "waiting"})
test1.add_item({"c1": "waiting"})
list_objects.append(test1) test2 = treeview_data.DataCollection()
test2.set_module({"Test2": "waiting"})
test2.add_item({"a2": "waiting"})
test2.add_item({"b2": "waiting"})
test2.add_item({"c2": "waiting"})
test2.add_item({"d2": "waiting"})
list_objects.append(test2) test3 = treeview_data.DataCollection()
test3.set_module({"Test3": "waiting"})
test3.add_item({"a2": "waiting"})
test3.add_item({"b2": "waiting"})
test3.add_item({"c2": "waiting"})
test3.add_item({"d2": "waiting"})
list_objects.append(test3) for object_num, object_module in enumerate(list_objects):
item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget)
brush = QtGui.QBrush(QtGui.QColor(176, 165, 172))
brush.setStyle(QtCore.Qt.SolidPattern)
item_0.setBackground(0, brush)
for module_name, module_result in object_module.module.items():
brush = QtGui.QBrush(QtGui.QColor(0, 255, 0))
brush.setStyle(QtCore.Qt.SolidPattern)
item_0.setBackground(1, brush)
self.treeWidget.topLevelItem(object_num).setText(0, _translate("MainWindow", module_name))
self.treeWidget.topLevelItem(object_num).setText(1, _translate("MainWindow", module_result))
for item_num, item_dic in enumerate(object_module.items):
for item_name, item_result in item_dic.items():
item_1 = QtWidgets.QTreeWidgetItem(item_0)
self.treeWidget.topLevelItem(object_num).child(item_num).setText(0, _translate("MainWindow",
item_name))
self.treeWidget.topLevelItem(object_num).child(item_num).setText(1, _translate("MainWindow",
item_result)) def modified_treewidget(self, num_one, num_two, str_one):
_translate = QtCore.QCoreApplication.translate
self.treeWidget.topLevelItem(num_one).child(num_two).setText(1, _translate(
"MainWindow",
str_one)) def go_update(self):
time.sleep(1)
# 更新treeview
self.list_result_update.emit(1, 1, "aaaaaaa") if __name__ == "__main__":
app = QApplication(sys.argv)
md = MainCode()
md.show()
app.exec_()
# sys.exit(app.exec_())
现在就完成了自定义槽函数了。
Python基础之用PyQt5界面代码分离以及自定义一个槽函数的更多相关文章
- 基于Python接口自动化测试框架+数据与代码分离(进阶篇)附源码
引言 在上一篇<基于Python接口自动化测试框架(初级篇)附源码>讲过了接口自动化测试框架的搭建,最核心的模块功能就是测试数据库初始化,再来看看之前的框架结构: 可以看出testcase ...
- python基础--小数据池,代码块的最详细、深入剖析
本文转至太白金星 一,id,is,== 在Python中,id是什么?id是内存地址,那就有人问了,什么是内存地址呢? 你只要创建一个数据(对象)那么都会在内存中开辟一个空间,将这个数据临时加在到内存 ...
- Python基础库之jieba库的使用(第三方中文词汇函数库)
各位学python的朋友,是否也曾遇到过这样的问题,举个例子如下: “I am proud of my motherland” 如果我们需要提取中间的单词要走如何做? 自然是调用string中的spl ...
- python基础-requests模块、异常处理、Django部署、内置函数、网络编程
网络编程 urllib的request模块可以非常方便地抓取URL内容,也就是发送一个GET请求到指定的页面,然后返回HTTP的响应. 校验返回值,进行接口测试: 编码:把一个Python对象编码转 ...
- Python基础总结之第十一天开始【再深入一下函数,重新认识一下】(新手可相互督促)
感谢最近大家的关注,希望我的学习笔记对大家有帮助!也感谢各位的评论和推荐,请多多指教. 在重新认识函数之前,我们先看两个函数.一个是我们在前面笔记经常用到的print() :另一个是input() ...
- PyQt(Python+Qt)学习随笔:Qt Designer中连接Action和槽函数
在Designer中试了半天,终于找到了Action添加槽函数的方法,操作步骤: 在Designer右边界面中点击鼠标右键 确保信号/槽编辑被勾选,如图是未勾选的情况:. 勾选后会出现信号和槽的编辑界 ...
- python基础===如何优雅的写代码(转自网络)
本文是Raymond Hettinger在2013年美国PyCon演讲的笔记(视频, 幻灯片). 示例代码和引用的语录都来自Raymond的演讲.这是我按我的理解整理出来的,希望你们理解起来跟我一样顺 ...
- python基础知识-8-三元和一行代码(推导式)
python其他知识目录 1.三元运算(三目运算) 三元运算符就是在赋值变量的时候,可以直接加判断,然后赋值格式:[on_true] if [expression] else [on_false]re ...
- Python基础之用PyQt5写一个tabview
前面学习了menu的画图,现在学习tabview的画图,关于怎么打开designer.exe部分就不详细介绍了. 第一步:拖动一个Tab Widget控件到窗口去. 将控件拖上去之后就是这个样子,默认 ...
随机推荐
- pytest初始化与清除(一)
一.初始化函数 1.测试用例级别:def setup() 2.套件级别(在模块文件中定义):def setup_module() 3.套件级别(在类中定义): @classmethod def set ...
- Typora 配置码云图床
目录 在码云创建一个项目作为自己床图 设置私人令牌 下载安装 PigGo Typora中设置图片上传选项 在码云创建一个项目作为自己床图 创建的项目必须为公开项目,创建的过程不细说了. 设置私人令牌 ...
- 【二分 贪心】覆盖问题 BZOJ1052 HAOI2007
覆盖问题 bzoj1052 题目来源:HAOI 2007 题目描述 某人在山上种了N棵小树苗.冬天来了,温度急速下降,小树苗脆弱得不堪一击,于是树主人想用一些塑料薄膜把这些小树遮盖起来,经过一番长久的 ...
- ORACLE中的PL/SQL
一. 1.过程,函数,触发器是pl/sql编写. 2. 过程函数触发器是在Oracle中. 3.pl/sql是非常强大的数据库过 ...
- Java实现单例模式的几种方式
单例模式(Singleton),保证在程序运行期间,内存中只有一个实例对象. 饿汉式,最常用的方式.JVM加载类到内存中时,创建实例,线程安全. public class Boss { private ...
- vue+element表格
效果图 备注:前后端分离实现效果 接下来是代码环节 <template> <div class="comprehensive-table-container" ...
- 实现opcache加速php7.X
一.环境准备 操作系统:Centos8.3.2011 软件:PHP7.2.24 二.安装过程 1.安装软件 [20:03:29 root@centos8 src]#dnf -y install php ...
- AcWing 1141. 局域网
某个局域网内有n台计算机和m条 双向 网线,计算机的编号是1~n由于搭建局域网时工作人员的疏忽, 现在局域网内的连接形成了回路,我们知道如果局域网形成回路那么数据将不停的在回路内传输,造成网络卡的现象 ...
- 打通“任督二脉”:Android 应用安装优化实战
疑问: (1)了解APK安装流程有什么好处 (2)了解APK安装流程可以解决什么问题 一.可以在安装流程里做什么 安装就分为下面三个阶段,每个阶段可以做些什么工作,可以帮助我们优化安装流程,解决安装后 ...
- buu crackRTF
一.无壳,拖入ida,静态编译一下 整体逻辑还是很清晰,这里我的盲区是那个加密函数,是md5,没看出来,内存地址看错了,之前用黑盒动调一下,发现猜不出来,看某位wp发现有的老哥,直接sha1爆破的,狠 ...