aszchong 2023-01-15 04:32 采纳率: 66.7%
浏览 118
已结题

关于python图形化界面pyside6的UI问题

我使用pyside6的QT Designer制作了图形界面,并且转换成了py文件,在主程序中使用“类”可以正常工作,但我不想把整个程序都写到这一个类里面,如果写外部函数又调用不了类里面的按钮,文本框等(比如禁用按钮,设置文本显示)。
我的问题是:
1如何不使用“类”来实现 按钮连接函数 和 窗口的正常显示与工作,请给出简明的示例代码。
2如果用“类”,那么如何用外部函数来设置按钮禁用和文本内容显示,请给出简明示例代码。
3主程序中的self.setupUi(self)是什么意思?(为什么要写这句)
十分感谢!

主程序

class Widget(QWidget, Ui_Form):
    def __init__(self):  
        super().__init__()  
        self.setupUi(self)
        self.tsb.clicked.connect(self.testspeed)  

    def speed(self):
        self.cs.setText("测速中") 
        self.cs.setEnabled(False)  
        self.info.setText('测速中。。。')
        self.sccs_thread = Thread(target=self.sccs)  # 建立线程实例
        self.sccs_thread.start()  # 开启线程
        

界面文件

class Ui_Form(object):
    def setupUi(self, Form):
        if not Form.objectName():
            Form.setObjectName(u"Form")
        Form.resize(989, 997)
        #测速按钮
        self.tsb = QPushButton(Form)
        self.tsb.setObjectName(u"cs")
        self.tsb.setFont(font)
        #信息显示窗口
        self.info = QTextBrowser(Form)
        self.info.setObjectName(u"info")
        self.info.setFont(font)


  • 写回答

3条回答 默认 最新

  • cjh4312 2023-01-15 08:34
    关注

    类实例化以后,不论你怎么都可以调用类的控件,函数里面你可以传参啊
    如果不使用类,ui还是一个类,实例化以后,直接调用就行。
    面向对象编程,代码多了,最好是分文件的。所以最后实际上很少会再单独写一个函数去调用主界面的控件,都是写成类的形式。
    self.setupUi(self)就是对界面初始化
    单独Ui文件(ui_form.py)

    class Ui_Widget(object):
        def setupUi(self, Widget):
            if not Widget.objectName():
                Widget.setObjectName(u"Widget")
            Widget.resize(800, 600)
            self.frame = QFrame(Widget)
            self.frame.setObjectName(u"frame")
            self.frame.setGeometry(QRect(80, 100, 641, 351))
            self.frame.setFrameShape(QFrame.StyledPanel)
            self.frame.setFrameShadow(QFrame.Raised)
            self.tsb = QPushButton(self.frame)
            self.tsb.setObjectName(u"tsb")
            self.tsb.setGeometry(QRect(60, 40, 82, 28))
            self.info = QTextBrowser(self.frame)
            self.info.setObjectName(u"info")
            self.info.setGeometry(QRect(200, 40, 256, 192))
    
            self.retranslateUi(Widget)
    
            QMetaObject.connectSlotsByName(Widget)
        # setupUi
    
        def retranslateUi(self, Widget):
            Widget.setWindowTitle(QCoreApplication.translate("Widget", u"Widget", None))
            self.tsb.setText(QCoreApplication.translate("Widget", u"PushButton", None))
    
    

    主程序

    # This Python file uses the following encoding: utf-8
    import sys
    import time
    from PySide6.QtWidgets import QApplication, QWidget,QHBoxLayout
    from PySide6.QtCore import QThread
    from thread import TestSpeed
    # Important:
    # You need to run the following command to generate the ui_form.py file
    #     pyside6-uic form.ui -o ui_form.py, or
    #     pyside2-uic form.ui -o ui_form.py
    from ui_form import Ui_Widget
    
    class Widget(QWidget):
        def __init__(self, parent=None):
            super().__init__(parent)
            self.ui = Ui_Widget()
            self.ui.setupUi(self)
            main_layout=QHBoxLayout()
            self.ui.frame.setLayout(main_layout)
            main_layout.addWidget(self.ui.tsb)
            main_layout.addWidget(self.ui.info)
            self.ui.tsb.setText("测速")
            self.ui.tsb.clicked.connect(self.speed)
            #线程初始化,子线程完成测试后,发信号给主界面。
            self.thread = QThread()
            self.test_thread=TestSpeed(self)
            self.test_thread.moveToThread(self.thread)
            self.test_thread._signal.connect(self.reflash)
    
        def speed(self):
            self.ui.tsb.setEnabled(False)
            self.ui.info.setText('测速中。。。')
            self.test_thread.start()
    
        def reflash(self):
            self.ui.info.setText('测速完毕')
            self.ui.tsb.setEnabled(True)
    
    def setText(Widget):
        Widget.ui.info.setText("准备测速")
        Widget.ui.tsb.setEnabled(True)
    
    if __name__ == "__main__":
        app = QApplication(sys.argv)
        widget = Widget()
        setText(widget)
        widget.show()
        sys.exit(app.exec())
    
    

    子线程:(thread.py)

    from PySide6.QtCore import Signal,QThread
    import time
    #import datetime
    
    class TestSpeed(QThread):
        #  通过类成员对象定义信号对象
        _signal = Signal()
    
        def __init__(self,parent):
            super(TestSpeed, self).__init__()
            self.parent=parent
    
        def __del__(self):
            self.wait()
    
        def run(self):
            time.sleep(1)
            for i in range(3):
    
                self.parent.ui.info.append(f"{i+1}秒")
                time.sleep(1)
            self._signal.emit()
    
    
    

    最终效果:

    img

    img

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 1月25日
  • 已采纳回答 1月17日
  • 修改了问题 1月15日
  • 创建了问题 1月15日

悬赏问题

  • ¥15 在虚拟机中安装flash code
  • ¥15 单片机stm32f10x编写光敏电阻调节3.3伏大功率灯亮度(光强越大灯越暗,白天正常光强灯不亮,使用ADC,PWM等模块)望各位找一下错误或者提供一个可实现功能的代码
  • ¥20 verilog状态机方法流水灯
  • ¥15 pandas代码实现不了意图
  • ¥15 GD32H7 从存储器到外设SPI传输数据无法重复启用DMA
  • ¥25 LT码在高斯信道下的误码率仿真
  • ¥45 渲染完成之后将物体的材质贴图改变,自动化进行这个操作
  • ¥15 yolov5目标检测并显示目标出现的时间或视频帧
  • ¥15 电视版的优酷可以设置电影连续播放吗?
  • ¥50 复现论文;matlab代码编写