【012】UI界面切换(销毁再现)实现参数传递_#py

UI界面切换

  • 1 需求
  • 2 错误方法
    • 2.1 pyqtSignal()
    • 2.2 类的子函数相互调用
  • 3. 调用外部文件,子函数中刷新界面实现

1 需求

  设计界面时,需要两个界面来回切换。
  切换的方式是一个界面的关闭,另一个界面的展现。
  第一个界面关闭时留给下一个界面一个参数,下个界面展示时即可或者该参数并在界面上做出相应的变化。

2 错误方法

2.1 pyqtSignal()

  这个是需要控件触发实现的,如果没有控件触发,是不会直接运行的。
  但直接放在def __init__(self):,是没有用的,反而会出现如下报错,即为递归次数过多。
使用参考

RecursionError: maximum recursion depth exceeded while getting the str of an object

2.2 类的子函数相互调用

  该方法可以实现子程序的调用,同时完成参数传递,但存在缺点,无法实现界面刷新。

  即便在界面刷新前后都无法实现界面内容变换,仅会影响子程序的运行,不会反应到另一个界面上。

  不同的界面,编写在不同的class类中,不同的类相互调用子函数时,仅调用子函数,而其值并不会子函数当前所在的类的其他函数。
使用参考

3. 调用外部文件,子函数中刷新界面实现

  通过逐行运行,最终发现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_())

你可能感兴趣的:(Python,ui,python,开发语言)