设计界面时,需要两个界面来回切换。
切换的方式是一个界面的关闭,另一个界面的展现。
第一个界面关闭时留给下一个界面一个参数,下个界面展示时即可或者该参数并在界面上做出相应的变化。
这个是需要控件触发实现的,如果没有控件触发,是不会直接运行的。
但直接放在def __init__(self):
,是没有用的,反而会出现如下报错,即为递归次数过多。
使用参考
RecursionError: maximum recursion depth exceeded while getting the str of an object
该方法可以实现子程序的调用,同时完成参数传递,但存在缺点,无法实现界面刷新。
即便在界面刷新前后都无法实现界面内容变换,仅会影响子程序的运行,不会反应到另一个界面上。
不同的界面,编写在不同的class
类中,不同的类相互调用子函数时,仅调用子函数,而其值并不会子函数当前所在的类的其他函数。
使用参考
通过逐行运行,最终发现Promainwindow()
可实现界面刷新
先在父类中按要求载入信息至txt文件(文件格式可自选)中,在子类中编写相应读取txt文件的函数,获取相应的参数并进行利用。
实现方法如下:
第一步:设置外部文件存储
def contentSave(self, Tmodel):
# 打开相应文件,设置读写模式
file = open('contentSave.txt', "w")
# 写入数据到文件中
file.write(str(Tmodel))
# 关闭文件
file.close()
第二步:设置父类的事件
def ken(self, t):
# 存储变化格式信息
self.contentSave(t)
# 关闭父类界面
self.close()
# 子类信息刷新
self.test = mywindow()
# 子类界面展示
self.test.show()
第三步:设置父类事件触发
# 用lambda可以设置button事件触发,子函数传参使用
self.btn1.clicked.connect(lambda: self.ken(1))
self.btn2.clicked.connect(lambda: self.ken(2))
第四步:设置子类接收
# 变量刷新
def flashinput(self):
# 打开文件,读取模式
with open('contentSave.txt', 'r') as f:
# 获取文件信息
content = f.read()
# 刷新界面内容
self.Tablemain(int(content))
通过以上方法即可实现UI界面切换(销毁再现)并完成参数传递。
点击下载完整代码
主要代码如下
from PyQt5 import QtWidgets, QtCore
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QCursor, QPixmap, QColor
from mytablewidget import Ui_Dialog
import sys
from PyQt5.QtCore import *
import time
import untitled
# 父类
class MainWindow(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('PyQt Async Example')
self.setGeometry(200, 200, 400, 300)
# 创建控件并布局
self.btn1 = QPushButton('1')
self.btn2 = QPushButton('2')
layout_widget = QVBoxLayout()
layout_widget.addWidget(self.btn1)
layout_widget.addWidget(self.btn2)
self.setLayout(layout_widget)
self.btn1.clicked.connect(lambda: self.ken(1))
self.btn2.clicked.connect(lambda: self.ken(2))
def ken(self, t):
self.contentSave(t)
self.close()
self.test = mywindow()
self.test.show()
print(t)
def contentSave(self, Tmodel):
file = open('contentSave.txt', "w")
# 写入数据到文件中
file.write(str(Tmodel))
# 关闭文件
file.close()
# 子类
class mywindow(QtWidgets.QMainWindow, untitled.Ui_MainWindow):
# 通过类成员对象定义信号对象
def __init__(self):
super(mywindow, self).__init__()
self.setupUi(self)
self.m_flag = False
self.setFixedSize(self.width(), self.height())
self.setAttribute(QtCore.Qt.WA_TranslucentBackground) # 设置窗口背景透明
# self.setWindowFlag(QtCore.Qt.FramelessWindowHint) # 隐藏边框
shadow = QGraphicsDropShadowEffect() # 创建阴影
shadow.setBlurRadius(20) # 设置阴影大小为9px
shadow.setColor(QColor("#444444")) # 设置颜色透明度为100的(0,0,0)黑色
shadow.setOffset(0, 0) # 阴影偏移距离为0px
self.setGraphicsEffect(shadow) # 添加阴影
self.flashinput()
# 变量刷新
def flashinput(self):
with open('contentSave.txt', 'r') as f:
content = f.read()
self.Tablemain(int(content))
print("ss")
# 表格初始化
def Tablemain(self, TsjModle):
if TsjModle == 1:
Somecontent = [['1', '', '', '', '', '']]
else:
Somecontent = [['1', '', '', '']]
print("ssa")
self.Rowcnt = len(Somecontent)
self.Colcnt = len(Somecontent[0])
self.tableWidget.setRowCount(self.Rowcnt)
self.tableWidget.setColumnCount(self.Colcnt)
# 设置水平方向的表头标签与垂直方向上的表头标签,注意必须在初始化行列之后进行,否则,没有效果
for i in range(0, self.Rowcnt):
for j in range(0, self.Colcnt):
newItem = QTableWidgetItem(Somecontent[i][j])
self.tableWidget.setItem(i, j, newItem)
self.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) # 表格横向自动适应边框
QTableWidget.resizeColumnsToContents(self.tableWidget) # 选择时单行高亮
# 设置各行高
self.tableWidget.setRowHeight(0, 40)
for i in range(1, self.Rowcnt):
self.tableWidget.setRowHeight(i, 30)
# 隐藏表格标签的
self.tableWidget.verticalHeader().setVisible(False)
self.tableWidget.horizontalHeader().setVisible(False)
self.tableWidget.setEnabled(True)
self.tableWidget.setSelectionBehavior(QTableWidget.SelectItems) # 设置表格内容多选
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
Main = MainWindow()
Main.show()
sys.exit(app.exec_())