PyQt创建界面


文档: https://www.riverbankcomputing.com/static/Docs/PyQt5/

面向过程编程

布局方案一

from PyQt5.QtWidgets import QWidget, QApplication, QPushButton
import sys


# 按钮事件
def click_btn():
    print("点击了按钮")
    
    
if __name__ == '__main__':
    app = QApplication(sys.argv)
    # 创建窗口及初始化
    window = QWidget()
    window.setWindowTitle('标题')
    window.resize(400, 400)
    window.move(400, 200)   # 窗口位置
    # 创建控件及初始化
    btn = QPushButton(window)     
    btn.setText("按钮")
    btn.move(200, 200)  # 控件位置
    btn.clicked.connect(click_btn)   # 按钮绑定函数
    # 窗口显示
    window.show()
    sys.exit(app.exec_())

这个界面窗口有个按钮,点击按钮触发输出事件,如果需要按钮绑定关闭窗口事件

from PyQt5.QtWidgets import QWidget, QApplication, QPushButton
import sys


# 按钮事件
def click_btn(UI_show):
    print("点击了按钮")
    UI_show.close()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    # 创建窗口及初始化
    window = QWidget()
    window.setWindowTitle('标题')
    window.resize(400, 400)
    window.move(400, 200)   # 窗口位置
    # 创建控件及初始化
    btn = QPushButton(window)
    btn.setText("按钮")
    btn.move(200, 200)  # 控件位置
    btn.clicked.connect(lambda: click_btn(window))   # 按钮绑定函数
    # 窗口显示
    window.show()
    sys.exit(app.exec_())

布局方案二
该方案采用了和方案一不一样的布局方式,我比较推荐使用这种,将控件与布局分隔开,方便代码阅读

from PyQt5.QtWidgets import QWidget, QApplication, QPushButton, QVBoxLayout
import sys


# 按钮事件
def click_btn():
    print("点击了按钮")


if __name__ == '__main__':
    app = QApplication(sys.argv)
    # 创建窗口及初始化
    window = QWidget()
    window.setWindowTitle('标题')
    window.resize(400, 400)
    window.move(400, 200)   # 窗口位置
    # 创建控件及初始化
    btn = QPushButton()
    btn.setText("按钮")
    btn.clicked.connect(click_btn)
    # 布局
    layout = QVBoxLayout()
    layout.addWidget(btn)
    window.setLayout(layout)
    # 窗口显示
    window.show()
    sys.exit(app.exec_())

面向对象编程

把窗口布局封装成一个类,然后生成类对象,下面这个窗口,点击按钮会关闭窗口

import sys
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QPushButton, QApplication


class QMainWindow(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)

        # 窗口属性
        self.setWindowTitle("标题")
        self.resize(400, 400)
        # 控件
        self.btn = QPushButton("按钮关闭窗口")
        self.btn.clicked.connect(self.click_btn)  # 按钮绑定事件
        # 布局
        self.layout = QVBoxLayout()
        self.layout.addWidget(self.btn)
        self.setLayout(self.layout)

    def click_btn(self):
        print('关闭窗口')
        self.close()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = QMainWindow()
    window.show()
    sys.exit(app.exec_())

界面与逻辑分离

这里将界面单独作为一个文件,只包含界面的设计布局等(self.setLayout之后就会自适应窗口大小),一些事件绑定和事件的实现作为另一个文件(事件的实现可以单独拿出来再做一个文件,即功能实现和事件绑定做一个文件,函数实现作为一个文件)

单一界面

界面文件(Ui_window.py)

from PyQt5.QtWidgets import QVBoxLayout, QPushButton
from PyQt5 import QtCore


class UI_QMainWindow(object):
    # 初始化可有可无·
    # def __init__(self):
    #     super(UI_QMainWindow, self).__init__()

    def setUI(self, MainWindow):
        # 窗口设置
        MainWindow.setObjectName("Mainwindow")
        MainWindow.resize(400, 400)
        # 控件
        self.btn = QPushButton("按钮关闭窗口")
        # 布局
        self.layout = QVBoxLayout(MainWindow)
        self.layout.addWidget(self.btn)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "标题"))
        self.btn.setText(_translate("MainWindow", "按钮"))

逻辑代码(启动文件)(按钮绑定事件,函数也可以单独定义到一个文件中,封装成类)

import sys
from PyQt5.QtWidgets import QApplication, QWidget
from Ui_Window import UI_QMainWindow

class FirstWindow(QWidget, UI_QMainWindow):
    def __init__(self):
        super(FirstWindow, self).__init__()
        self.setUI(self)

        self.btn.clicked.connect(self.click_btn)

    def click_btn(self):
        print('点击了按钮,关闭窗口')
        self.close()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = FirstWindow()
    window.show()
    sys.exit(app.exec_())

通过按钮打开新界面(原界面不关闭)

运行时先打开Ui_Window.py界面,点击按钮后打开Ui_2.py界面,原界面不关闭
界面一(Ui_Window.py):

from PyQt5.QtWidgets import QVBoxLayout, QPushButton
from PyQt5 import QtCore


class UI_QMainWindow(object):
    def setUI(self, MainWindow):
        # 窗口设置
        MainWindow.setObjectName("Mainwindow")
        MainWindow.resize(400, 400)
        # 控件
        self.btn = QPushButton()
        # 布局
        self.layout = QVBoxLayout(MainWindow)
        self.layout.addWidget(self.btn)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "窗口一"))
        self.btn.setText(_translate("MainWindow", "按钮"))

界面二(Ui_2.py):

from PyQt5.QtWidgets import QVBoxLayout, QPushButton
from PyQt5 import QtCore


class Ui_win(object):
    def setUI(self, MainWindow):
        MainWindow.setObjectName("Mainwindow")
        MainWindow.resize(200, 200)
        # 控件
        self.btn1 = QPushButton()
        # 布局
        self.layout = QVBoxLayout(MainWindow)
        self.layout.addWidget(self.btn1)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "窗口二"))
        self.btn1.setText(_translate("MainWindow", "按钮"))

逻辑代码
修改main.py中的点击函数(wid前一定要加self,不加self则没有app = QApplication(sys.argv)支持,会闪退

import sys
from PyQt5.QtWidgets import QApplication, QWidget
from Ui_Window import UI_QMainWindow
from Ui_2 import Ui_win


class FirstWindow(QWidget, UI_QMainWindow):
    def __init__(self):
        super(FirstWindow, self).__init__()
        self.setUI(self)
        # 绑定事件
        self.btn.clicked.connect(self.click_btn)

    def click_btn(self):
        # 这里wid前一定要加self将其加入到主进程的self中,不加self则没有app = QApplication(sys.argv)支持,会闪退
        self.wid = QWidget()
        Ui = Ui_win()
        Ui.setUI(self.wid)
        self.wid.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = FirstWindow()
    window.show()
    sys.exit(app.exec_())

通过按钮打开新界面(原界面关闭)

运行时先打开Ui_2.py文件的界面,点击按钮后,该界面会关闭,接着打开UiWindow.py文件界面

界面一(UiWindow.py):

from PyQt5.QtWidgets import QVBoxLayout, QPushButton
from PyQt5 import QtCore


class UI_QMainWindow(object):
    def setUI(self, MainWindow):
        # 窗口设置
        MainWindow.setObjectName("Mainwindow")
        MainWindow.resize(400, 400)
        # 控件
        self.btn = QPushButton()
        # 布局
        self.layout = QVBoxLayout(MainWindow)
        self.layout.addWidget(self.btn)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "窗口一"))
        self.btn.setText(_translate("MainWindow", "按钮"))

界面二(Ui_2.py):

from PyQt5.QtWidgets import QVBoxLayout, QPushButton
from PyQt5 import QtCore


class Ui_win(object):
    def setUI(self, MainWindow, window):
        MainWindow.setObjectName("Mainwindow")
        MainWindow.resize(200, 200)
        # 控件
        self.btn1 = QPushButton()
        # 布局
        self.layout = QVBoxLayout(MainWindow)
        self.layout.addWidget(self.btn1)

        self.btn1.clicked.connect(lambda: self.click_btn1(MainWindow, window))

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def click_btn1(self, MainWindow, window):
        MainWindow.close()
        window.show()

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "窗口二"))
        self.btn1.setText(_translate("MainWindow", "按钮"))

逻辑代码

import sys
from PyQt5.QtWidgets import QApplication, QWidget
from Ui_Window import UI_QMainWindow
from Ui_2 import Ui_win


class FirstWindow(QWidget, UI_QMainWindow):
    def __init__(self):
        super(FirstWindow, self).__init__()
        self.setUI(self)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main_window = FirstWindow()
    wid = QWidget()
    Ui = Ui_win()
    Ui.setUI(wid, main_window)
    wid.show()
    sys.exit(app.exec_())
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值