[python] 3. pyqt5乱搞,试试子鲜橙,左右布局

版本:

pyqt 5.9 pycharm+anaconda win10

效果:

思路:

总体使用网格布局,左侧用垂直布局,右侧用栈布局

按钮绑定切换事件,根据按钮id决定切哪个

子界面1创建子线程,激活自定义信号刷新界面,这招超实用!

 

实现:

其实就两个.py  具体看注释

主界面的py

from PyQt5.QtCore import QThread ,  pyqtSignal,  QDateTime
from PyQt5.QtWidgets import QApplication,  QDialog,  QLineEdit\
    ,QWidget,QGridLayout,QPushButton,QLabel,QStyleFactory,QHBoxLayout,QVBoxLayout,QFrame,QStackedLayout
import time
import sys
import random

from son1 import Panel2,Panel1,Panel3


class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('PyQt 5界面实时更新例子')
        self.resize(1300, 700)
        #总布局
        self.layout=QGridLayout(self)
        self.leftfuck=QWidget(self)     #空物体
        self.rightfuck=QWidget(self)    #空物体
        self.left=QVBoxLayout(self)     #左侧菜单栏垂直布局
        self.right=QStackedLayout(self) #右侧切换采用栈布局

        #添加左侧按钮1 2 3  绑定切换事件switchs  设置id
        self.btn1 = QPushButton("menu1", self)
        self.btn2 = QPushButton("menu2", self)
        self.btn3 = QPushButton("menu3", self)
        self.btn1.clicked.connect(self.switchs)
        self.btn1.setObjectName("btn1")
        self.btn2.clicked.connect(self.switchs)
        self.btn2.setObjectName("btn2")
        self.btn3.clicked.connect(self.switchs)
        self.btn3.setObjectName("btn3")

        #左侧锤子布局添加按钮 1 2 3
        self.left.addWidget(self.btn1)
        self.left.addWidget(self.btn2)
        self.left.addWidget(self.btn3)

        self.leftfuck.setLayout(self.left)
        self.rightfuck.setLayout(self.right)
        self.layout.addWidget(self.leftfuck,0,0)
        self.layout.addWidget(self.rightfuck,0,1,1,4) #设置水平跨4行

        self.initUI()

    def initUI(self):
        #声明Panel (在son1.py里面 )
        self.frame1 = Panel1()
        self.frame2 = Panel2()
        self.frame3 = Panel3()

        #嵌套布局加入Panel 123
        self.right.addWidget(self.frame1)
        self.right.addWidget(self.frame2)
        self.right.addWidget(self.frame3)
        QApplication.processEvents() #这个还没起作用,可加可不加,作用是让耗时过程(io) 先处理,主界面继续刷新

    def switchs(self): #根据id 切换页面
        dic={"btn1":0,"btn2":1,"btn3":2}
        index=dic[str(self.sender().objectName())]
        self.right.setCurrentIndex(index)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = Window()
    win.show()

    sys.exit(app.exec_())

 

子界面的py ,QFrame 是QWidget的拓展类

from PyQt5.QtCore import QThread ,  pyqtSignal,  QDateTime
from PyQt5.QtWidgets import QApplication,  QDialog,  QLineEdit\
    ,QWidget,QGridLayout,QPushButton,QLabel,QStyleFactory,QHBoxLayout,QVBoxLayout,QFrame
import time
import sys
import random

class BackendThread(QThread):    #线程类
    # 通过类成员对象自定义信号
    update_date = pyqtSignal(str)

    # 处理业务逻辑
    def run(self):
        while True:
            data = QDateTime.currentDateTime()
            currTime = data.toString("yyyy-MM-dd hh:mm:ss")  #修改时间
            self.update_date.emit(str(currTime))   #每秒激活,发射一次信号
            time.sleep(1) #至少加0.01,不然会卡死



class Panel1(QFrame):
    def __init__(self):
        super().__init__()
        self.input = QLineEdit(self)
        self.input.resize(400, 30)
        self.initUI()
    def initUI(self):
        self.setStyleSheet("QFrame{background-color:blue}")  # ""里面用类css语法表示样式
        # 创建线程
        self.backend = BackendThread()
        # 连接信号   自定义信号update_date 绑定 物体事件handleDisplay
        self.backend.update_date.connect(self.handleDisplay)
        # 开始线程
        self.backend.start()

    def handleDisplay(self, data):
        self.input.setText(data)

class Panel2(QFrame):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        self.setStyleSheet("QFrame{background-color:red}")

class Panel3(QFrame):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        self.setStyleSheet("QFrame{background-color:yellow}")

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值