009. (4.9) GUI--Pyqt5入门学习

参考文章:
python gui 中三大框架tkinter,wxpython, pyqt
PyQt5(designer)入门指引
PyQt5教程 - QtDesigner窗口设计工具的使用

PyQt5简介

pyqt5是一套Python绑定Digia QT5应用的框架。Qt库是最强大的GUI库之一。

pyqt5做为Python的一个模块,它有620多个类和6000个函数和方法。这是一个跨平台的工具包,它可以运行在所有主要的操作系统,包括UNIX,Windows,Mac OS。pyqt5是双重许可。开发者可以在GPL和商业许可之间进行选择。比起Tkinter的UI布局全靠代码实现,只有15种常用部件,显示效果简陋,PyQt5更有优势。

初识Qt Designer

通常来说,编写GUI有两种方法: 第一种就是直接使用方便快捷的Qt Designer。 第二种就是写代码。在有Qt Designer的情况下,是完全不推荐费时费力手写GUI代码的。

Qt Designer中的操作方式十分灵活,其通过拖拽的方式放置控件可以随时查看控件效果。此外,它还实现了视图和逻辑的分离。

Qt Designer可以所见即所得,并且可以方便的修改并做出各种调整,另外我们也可以通过它生成的代码来学习一些窗口控件的用法。

当然,要做出华丽的界面还是要学代码的。

生成Python代码

使用cmd将目录切到文件所在目录并执行下面的命令。请自行将下面命令中的name替换成文件名

pyuic5 -o name.py name.ui

此时尝试运行刚刚生成的“HelloWorld.py”是没用的,因为生成的文件并没有程序入口。(缺少主程序部分)**因此我们在同一个目录下另外创建一个程序叫做“main.py”,并输入如下内容。在本例中,gui_file_name就是HelloWorld,请自行替换。

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow

import gui_file_name

if __name__ == '__main__':
    app = QApplication(sys.argv)
    MainWindow = QMainWindow()
    ui = gui_file_name.Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

然后运行“main.py”,就能看到刚编写的GUI了。

交互
  • 1 获取button的 “ID”
    “Property Editor”中可以得知一个个按钮的“objectName”

  • 2 设置触发
    回到另外创建的主程序py中,增添代码。
    在“main.py”中“MainWindow.show()”的后面加入下面这样的一行代码:

    ui.pushButton.clicked.connect(click_success)
    

    解释下:

  • pushButton就是刚刚获取的按钮id

  • clicked就是信号,因为是点击,所以我们这里用clicked

  • click_success就是对应要调用的注意这里函数并不写成click_success() !!!

  • 既然刚刚设置了button触发并绑定了一个函数click_success,就要在“main.py”中实现它:

    def click_success():
    	print("成功!")
    

    搞定。
    从上可以了解到,QT designer设计UI,保存为ui文件ui文件生成对应代码xx.py,但我们用另创建的main.py来执行程序UI跟逻辑分离的好处就在这里,我们这次不用去管“HelloWorld.py”了,直接运行修改完的“main.py”。

传参 (实例:单向汇率转换器)
  • 注意,GUI的main程序编写时,不能通过正常的方式进行传参。 对于传参,有两种解决方案,一种是使用lambda,还有一种是使用functool.partial。在接下来的环节中我们会使用partial:
 	partial(function, arg1, arg2, ......)

要在程序(main.py)的头部加上下面这行:

 from functools import partial

把之前按钮触发一行的代码修改为:

ui.pushButton.clicked.connect(partial(convert, ui))
  • 编写convert函数(我将其视为逻辑部分)
def convert(ui):
    input = ui.lineEdit.text()## lineEdit为输入框的对象名,再用text()方法
    result = float(input) * 6.7
    ui.lineEdit_2.setText(str(result))## setText()并转换为str

对GUI应用于原有程序的些许思考

首先要明确的是面向对象编程,类要有,一个个类中的函数也要分明。这样便于代码编写、整理、浏览。

那么如何在原有代码基础上用GUI呈现程序呢?

这里似乎又要借鉴平时使用APP的经历。当我们使用APP时,总是在一个又一个图形窗口中进行选择,按下button、输入(搜索)以及进行其他图形界面的交互时,程序便开始执行对应内容。

所以现在的初步想法是 在有关图形界面交互的函数中 嵌套 原有程序的对应执行函数,但等具体操作时才能确认这种做法是否合理。

小结

今天算是小休息,因为对GUI抱有好奇心,便想了解相关知识。QT designer的确方便强大,还能对ui文件自动生成代码,而且外观也挺标致。UI与逻辑分离是Pyqt5的一大特色,逻辑部分的编写还需在实操中不断学习和熟悉。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'aaa.ui' # # Created by: PyQt5 UI code generator 5.11.3 # # WARNING! All changes made in this file will be lost! import sys, os from PyQt5 import QtCore, QtWidgets, QtGui from PyQt5.QtCore import * from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5 import QtCore, QtGui, QtWidgets class U_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(1204, 836) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth()) MainWindow.setSizePolicy(sizePolicy) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.tableWidget = QtWidgets.QTableWidget(self.centralwidget) self.tableWidget.setGeometry(QtCore.QRect(80, 240, 1041, 371)) self.tableWidget.setAutoScrollMargin(9) self.tableWidget.setRowCount(9) self.tableWidget.setColumnCount(8) self.tableWidget.setObjectName("tableWidget") item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(0, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(1, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(2, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(3, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(4, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(5, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(6, item) item = Q
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值