首页 > 编程语言 >Python基础知识-8(PyQt GUI开发,输出乱码处理)

Python基础知识-8(PyQt GUI开发,输出乱码处理)

时间:2024-09-04 22:53:48浏览次数:13  
标签:__ sys Python GUI PyQt6 乱码 ui import app

(目录)


介绍一个VSCode轻量级 Rest API 客户端插件:Thunder Client

一、关于shebang

  • 明确指定解释器
#!/usr/bin/python3
  • 在shell中寻找第一个python解释器
#!/usr/bin/env python3

二、Python类的私有方法/属性

Python不支持私有方法/属性,但可以将类成员方法/属性名定义为形如“__xxx”,如要访问可通过“_class__xxx”来访问,相当于做了一个“障眼法”,以避免你无意的破坏。这种做法相当于定义了私有成员。

三、PyQt图形界面的使用

1. PyQt和PySide的区别

image.png

2. 在VSCode中搭建PyQt6的开发环境

  • 安装软件包
pip install PyQt6
pip install pyqt6-tools

测试安装结果

from PyQt6.QtWidgets import QApplication, QWidget, QLabel
import sys

app = QApplication(sys.argv)  # 创建一个应用
print(sys.argv)
print(app.arguments())

window = QWidget()
window.setWindowTitle("开始学习PyQt6")
window.resize(400, 300)
window.move(100, 300)
window.show()

label = QLabel()
label.setText("来吧,一起学习PyQt6吧!")
label.move(80, 80)
label.resize(150, 50)
label.setStyleSheet("background-color:yellow;padding:10px")
label.setParent(window)
label.show()

sys.exit(app.exec())  # 开始执行程序,并且进入消息循环等待
  • 安装插件 “PYQT Integration” image.png

  • 配置 “Pyuic” 和 “Qt Designer” 的路径 image.png
    image.png
    image.png

  • Pyuic的路径通常位于Python环境下的Scripts\pyuic6.exe
  • Qt Designer的路径通常位于Python环境下的Lib\site-packages\qt6_applications\Qt\bin\designer.exe。或者单独安装Qt6,这样Qt Designer安装结果如下: image.png
  • 打开Qt Designer界面 在VSCode资源管理器中右键点击项目目录,选择 “PYQT: New Form”,这将打开Qt Designer界面。 image.png
    在设计好GUI界面后(比如新建Widget),可以生成.ui文件(实际是个XML文件),并通过编译将其转换为.py文件。编译方法如下:
pyuic6 hello_qt.ui -o hello_qt.py

或者在VSCode的界面中完成: 选择PYQT: Compile Form
image.png

随后用主程序调用生成的.py类文件即可。

可以将生成的python打包为EXE文件,然后使用Inno Setup(https://jrsoftware.org)制作安装包——如果配置脚本中有中文,需要改成GBK编码。

测试用主程序如下:

import sys
from PyQt6.QtWidgets import QApplication, QWidget
from Ui_hello_qt import (
    Ui_Form,
)  # designer生成的UI文件,通过pyuic编译生成的类Ui_Form,在此处被导入


class MainForm(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.__ui = Ui_Form()
        self.__ui.setupUi(self)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainForm()
    window.show()
    sys.exit(app.exec())

也可以:

import sys
from PyQt6.QtWidgets import QApplication, QWidget
from Ui_hello_qt import (
    Ui_Form,
)  # designer生成的UI文件,通过pyuic编译生成的类Ui_Form,在此处被导入

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = QWidget()
    Ui_Form().setupUi(window)
    window.show()
    sys.exit(app.exec())

还可以

import sys
from PyQt6.QtWidgets import QApplication
from PyQt6 import uic

if __name__ == "__main__":
    app = QApplication(sys.argv)

    ui = uic.loadUi("GUI/hello_qt.ui")
    ui.show()

    sys.exit(app.exec())

3. 加载QSS样式文件

QSS类似CSS,用于描述控件的样式。

  • QSS样式文件
# 下边的label2是控件的objectName,这里的井号是选择器。不加井号就选中所有QLabel控件对象。
QLabel#label2 {
    background-color: #f4f2c9;
    color: #d80d28;
    font-size: 16px;
    font-weight: bold;
}
  • 使用代码加载QSS
import sys
from PyQt6.QtWidgets import QApplication
from PyQt6 import uic

if __name__ == "__main__":
    app = QApplication(sys.argv)

    with open("GUI/label2.qss", "r") as f:
        app.setStyleSheet(f.read())

    ui = uic.loadUi("GUI/hello_qt.ui")
    ui.setWindowTitle("Hello Qt")
    ui.label2.setText("Hello foo!") # label2是控件的objectName

    ui.show()

    sys.exit(app.exec())
  • 利用QSS批量设置控件样式 QSS样式文件
QLabel[level="error"] {
    color: red;
    font-size: 18px;
}

QLabel[level="warning"] {
    color: blue;
    font-size: 18px;
}

使用代码设置样式(这里利用到了控件的自定义属性)

import sys
from PyQt6.QtWidgets import QApplication
from PyQt6 import uic

if __name__ == "__main__":
    app = QApplication(sys.argv)

    with open("GUI/label.qss", "r") as f:
        app.setStyleSheet(f.read())

    ui = uic.loadUi("hello_qt.ui")

    label_1 = ui.label_1
    label_2 = ui.label_2
    label_3 = ui.label_3
    label_1.setProperty("level", "warning")
    label_2.setProperty("level", "error")
    label_3.setProperty("level", "error")

    ui.show()

    sys.exit(app.exec())

4. 在VSCode中为python程序的执行设置命令行参数

首先安装插件:Code Runner 在项目根目录的.vscode/中,配置settings.json

{
    "code-runner.executorMap": {
        "python": "set PYTHONIOENCODING=utf8 && D:/python_envs/py3d11/python -u $fileName arg1 arg2 arg3"
    }
}

然后run code(Ctrl + Alt + N)。这里 “arg1 arg2 arg3” 就是命令行参数。

“$fileName”表示当前目录下的文件名。也可以使用绝对路径文件名“$fullFileName”。

5. 解决Windows控制台默认编码GBK导致的输出乱码问题

  • 代码级解决方法 在向终端输出前使用如下代码
import io
import sys

sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf8")
# 下边是print()语句
  • 命令级解决方法 在执行的命令前加入环境变量的设置
set PYTHONIOENCODING=utf8 && D:/python_envs/py3d11/python -u demo.py
  • 系统级解决方法 为Windows操作系统配置环境变量
PYTHONIOENCODING=UTF8

记得重启VSCode,使配置生效。

6. 信号与槽函数

信号就是事件,槽函数就是事件处理函数。可以形象地将信号看成玻璃珠,这些不同颜色的玻璃珠子倒出来会被不同的凹槽接住——实施处理。 Qt designer可以编辑信号与槽,如下: image.png
image.png
image.png
看下ui通过pyuic自动生成的代码:

self.pushButton.clicked.connect(self.pushButton.close)

完整代码案例:

import sys
from PyQt6.QtWidgets import QApplication, QPushButton, QMessageBox
from PyQt6 import uic


def say_hello():
    msgBox = QMessageBox()
    msgBox.setIcon(QMessageBox.Icon.Information)
    msgBox.setWindowTitle("提示")
    msgBox.setText("你好")
    msgBox.setStandardButtons(QMessageBox.StandardButton.Ok)
    msgBox.exec()


if __name__ == "__main__":
    app = QApplication(sys.argv)

    ui = uic.loadUi("GUI/hello_qt.ui")

    pbt: QPushButton = ui.pushButton2
    pbt.clicked.connect(say_hello)
    # 或者使用lambda函数形式
    # pbt.clicked.connect(lambda: say_hello(这里可以带参数列表))

    # 一个信号可以发给多个槽函数来接收处理
    """
    pbt.clicked.connect(lambda: calc(1, int(lineEdit_2.text()), 3))
    pbt.clicked.connect(lambda: set_style(lineEdit_3))
    """
    ui.show()

    sys.exit(app.exec())

代码中的“:”和“->”分别用于注释变量类型和返回值类型。只是用于注释,没有实际的语法作用。

四、PyQt6程序的打包发布

使用Pyinstaller

pip install pyinstaller -i https://mirrors.aliyun.com/pypi/simple

1. 打包普通python程序

普通Python程序指的是完全使用Python内置模块或者对象实现的程序,程序中不包括任何第三方模块。

pyinstaller -F -i your_ico.ico your_script.py

下面是一些常用的命令行选项:

-F:将所有文件打包为一个单独的可执行文件。
-D:将所有文件打包为一个目录,包含可执行文件和所有依赖的文件。
-c:将程序与命令提示符结合在一起,以便在命令提示符下运行。
-d:将调试信息打包进可执行文件中。
-F, --onefile:将所有文件打包为一个单独的可执行文件。
-o:指定输出文件的位置。
-w:打包为窗口文件。
-p DIR, --paths DIR:设置导入路径(多个路径用;分隔),从而导入需要的模块
-i, --icon 指定ico图标文件

在dist目录可以找到打包生成的exe可执行文件。

2. 打包PyQt6程序

关键是要引入PyQt6的依赖包。

# pyinstaller -p PyQt6模块路径 -Fw --icon=窗口图标文件.ico 文件名.py
pyinstaller -p D:\python_envs\py3d11\Lib\site-packages\PyQt6\Qt6\bin -Fw -i dog.ico main.py

需要将依赖的ui,图片等资源文件与打包生成的exe文件放入相同的文件夹,比如dist/。

标签:__,sys,Python,GUI,PyQt6,乱码,ui,import,app
From: https://blog.51cto.com/cerana/11920737

相关文章

  • 【python】一篇搞懂多解释器与虚拟环境
    一.同一PC上,python同时支持多个版本的解释器共存1.1:安装不同版本python解释器(参考百度资料)#python安装后,解释器目录介绍C:\python39-python.exe[解释器]-Scripts-pip.exe-pip3.exe-pip3.9.exe-Lib-re.py-random.py内......
  • Python中的类与对象:构建现实世界的抽象
    引言类(Class)和对象(Object)是面向对象编程(OOP)的基础。通过定义类,我们可以创建具有相同属性和行为的对象集合。这不仅提高了代码的组织性和可读性,还使得维护变得更加容易。无论是开发小型应用程序还是大型系统,掌握类与对象都是必不可少的技能。基础语法介绍在Python中,定义一个类非......
  • Python中的“类与对象:实例化对象”——掌握面向对象编程的核心技能
    引言面向对象编程不仅是一种编程范式,更是一种思考方式。它允许我们以“对象”为中心来组织代码,每个对象都包含数据(属性)和可以操作这些数据的方法。类则是定义了对象的蓝图或模板,描述了该类型的对象应该具有哪些属性和方法。而实例化对象,则是从这个蓝图中创建具体实例的过程。掌握......
  • 【python】socket 入门以及多线程tcp链接
    Socket入门及多线程tcp链接网络基础知识三要素Socket是套接字的意思,是网络编程的核心对象,通信两端都独有自己的Socket对象,数据在两个Socket之间通过字节流(TCP协议)或者数据报包(UDP协议)的形式进行传输.本文主要针对tcp流程进行讲解socket-tcp流程图1.创建......
  • 网络编程--python
    网络编程1、介绍(一)、概述网络编程也叫套接字编程,Socket编程,就是用来实现网络互联的不同计算机上运行的程序间可以进行数据交互(二)、三要素IP地址:设备(电脑,手机,IPad,耳机…)在网络中的唯一标识.端口号:程序在设备上的唯一标识.协议:通信(传输)......
  • 【python因果推断库6】使用 pymc 模型的工具变量建模 (IV)1
    目录使用pymc模型的工具变量建模(IV)使用pymc模型的工具变量建模(IV)这份笔记展示了一个使用工具变量模型(InstrumentalVariable,IV)的例子。我们将会遵循Acemoglu,Johnson和Robinson(2001)的一个案例研究,该研究尝试解开强大的政治机构对于以国内生产总值(GDP)......
  • Python | 爬虫实战——亚马逊搜索页监控(附详细源码)
    背景做亚马逊店铺,如果你的品卖爆了,免不得遇到被人跟品、广告关键词竞争甚至是恶意投诉等事情。如果靠人去检查产品是否正常,存在不及时的问题。所以,基本都会想要有一个自动检测的工具。一般是自动根据关键词,设置邮编,查看对应市场下的搜索结果页是否,然后进一步判断搜索结构页......
  • How to draw a simple relation graph in Python
    forward:https://martinlwx.github.io/en/how-to-draw-a-simple-relation-graph-in-python/ IntroTheprocessofdrawingasimplerelationgraphinpythoncanbebrokendowninto2steps.Defineagraph.Drawagraph.Step1.DefineagraphInthisstep,......
  • python遍历之批量更改文件名
    遍历方式更改文件名importosimportsys#定义一个名字叫做rename的函数defrename(filePath):"""批量重命名指定路径下的'.dbf','.prj','.shp','.shx'格式的文件,重命名格式:文件_文件夹名字,并删除'.sbn','.sbx','.......
  • 【Python】数据可视化之分类图
    目录条形图箱形图散点图分簇散点图小提琴分簇小提琴条形图条形图是一种直观的图表形式,它通过不同长度的矩形条(即“条形”)来展示数值变量的中心趋势估计值,其中每个矩形的高度直接对应于该组数据的某个中心量度(如均值、中位数等)。此外,为了向观众传达关于这些中心趋势估......