(7)python开发经验

文章目录

      • [1 找不到资源文件](#1 找不到资源文件)
      • [2 使用subprocess执行时有黑色弹窗](#2 使用subprocess执行时有黑色弹窗)
      • [3 找不到exec](#3 找不到exec)
      • [4 pyside6-project lupdate的bug](#4 pyside6-project lupdate的bug)
      • [5 找不到pyd模块](#5 找不到pyd模块)
      • [6 pyd模块编码错误](#6 pyd模块编码错误)
      • [7 运行显示`Qt platform plugin "windows" in "`](#7 运行显示Qt platform plugin "windows" in ")
      • [8 `tr()`包含的字符串无法被翻译](#8 tr()包含的字符串无法被翻译)

更多精彩内容
👉内容导航 👈
👉Qt开发 👈
👉python开发 👈

1 找不到资源文件

使用rcc将qrc文件编译为py文件后,找不到资源文件可能是因为使用的是python原生的函数,这里是一个大坑,例如:

python 复制代码
print(QFile.exists(":/style/style.css"))   # true
print(os.path.exists(":/style/style.css")) # false
# 打开失败
with open(":/style.css", "r") as f:
    app.setStyleSheet(f.read())  # 设置样式表

2 使用subprocess执行时有黑色弹窗

  • 如下所示,可通过shell=True指定使用shell执行,不会出现弹窗。

    shell 复制代码
    ret = subprocess.run(['adb', 'connect', '127.0.0.1:7555'], shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE)

3 找不到exec

错误信息:

shell 复制代码
Traceback (most recent call last):
  File "E:\Code\py\PythonProject\main.py", line 27, in <module>
    sys.exit(app.exec())
AttributeError: 'PySide2.QtWidgets.QApplication' object has no attribute 'exec'

解决办法:

  • PySide2中使用的是sys.exit(app.exec_()),PySide6使用的是sys.exit(app.exec())

4 pyside6-project lupdate的bug

  • 使用pyside6-project lupdate命令可以在pyside6中生成翻译使用的ts文件,但是有时候我们想将ts文件放在子文件夹下,却发现无法实现;

  • 并且使用pyside6-project lupdate命令无法清除已经失效的文本;

  • 这是因为pyside6-project lupdate中使用的是ts文件名,不包含路径,所以就是在工程路径下,并且有几个ts文件就会执行几次。

    c 复制代码
    (.venv) PS E:\Code\py\Test> pyside6-project.exe lupdate
    pyside6-lupdate main.py mainwindow.py TableWidget.py mainwindow.ui logwidget.ui control.ui -ts Test_zh_CN.ts
  • 实现代码如下所示:for用来遍历ts文件,有几个ts文件就会调用run_command()执行几次。

    python 复制代码
    cmd_prefix.append("-ts")
            for ts_file in self.project.ts_files:
                if requires_rebuild(source_files, ts_file):
                    cmd = cmd_prefix
                    cmd.append(ts_file.name)
                    run_command(cmd, cwd=project_dir)
  • 解决办法:打开.venv\Lib\site-packages\PySide6\scripts\project.py文件,在def lupdate(self)函数中修改为下面所示代码。

    python 复制代码
    def lupdate(self):
        for sub_project_file in self.project.sub_projects_files:
            Project(project_file=sub_project_file).lupdate()
    
        if not self.project.ts_files:
            print(f"{self.project.project_file.name}: No .ts file found.",
                  file=sys.stderr)
            return
    
        source_files = self.project.python_files + self.project.ui_files
        project_dir = self.project.project_file.parent
        cmd_prefix = [LUPDATE_CMD] + [os.fspath(p.relative_to(project_dir)) for p in source_files]
        cmd_prefix.append("-ts")
        ts_files = []
        for ts_file in self.project.ts_files:
            if requires_rebuild(source_files, ts_file):
                ts_dir = ts_file.parent
                if not ts_dir.exists():
                    ts_dir.mkdir(parents=True, exist_ok=True)
                ts_files.append(ts_file.resolve().as_posix())
        if ts_files:
            cmd = cmd_prefix;
            cmd.extend(ts_files)
            cmd.append("-no-obsolete") # 清除失效文本
            run_command(cmd, cwd=project_dir)
  • 运行结果如下所示:会将ts文件生成到指定路径中,并且只执行一次。

    c 复制代码
    (.venv) PS E:\Code\py\Test> pyside6-project.exe lupdate
    pyside6-lupdate main.py mainwindow.py TableWidget.py mainwindow.ui logwidget.ui control.ui -ts E:/Code/py/Test/Language/Test_zh_CN.ts E:/Code/py/Test/Language/Test_en_US.ts

5 找不到pyd模块

  • 可能是python版本不一致,例如pyd是使用python3.12编译,使用python3.8导入就找不到。
  • 如果PYBIND11_MODULE中设置的模块名称和pybind11_add_module指定编译生成的名称不同也找不到。

6 pyd模块编码错误

  • python默认使用utf-8编码,如果使用pybind11导出的cpp文件使用的是其他编码,则生成的pyd模块导入时会报错。
shell 复制代码
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb2 in position 5: invalid start byte

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "E:\Code\py\PythonProject1\main.py", line 1, in <module>
    import pcba_plugin
ImportError: initialization failed

7 运行显示Qt platform plugin "windows" in "

shell 复制代码
qt.qpa.plugin: Could not find the Qt platform plugin "windows" in ""
This application failed to start because no Qt platform plugin could be initialized.  Reinstalling the application may fix this problem.
  • 解决办法:路径不要有中文名。

8 tr()包含的字符串无法被翻译

  • 在PySide6中,self.tr() 方法用于翻译字符串。

  • 如果你发现 self.tr(f"中文{test}") 这样的格式无法被翻译,可能是因为Qt的翻译系统无法识别这种格式的字符串。

  • Qt的翻译工具(如 lupdate)通常需要字符串是静态的,以便能够提取这些字符串进行翻译。

  • 解决办法,改为:

    python 复制代码
    self.tr("设备{arg}已离线:").format(arg=text)
    # 或者
    self.tr("发现新设备:") + device


相关推荐
应用市场21 小时前
构建自定义命令行工具 - 打造专属指令体
开发语言·windows·python
东方佑21 小时前
从字符串中提取重复子串的Python算法解析
windows·python·算法
Dfreedom.1 天前
一文掌握Python四大核心数据结构:变量、结构体、类与枚举
开发语言·数据结构·python·变量·数据类型
一半烟火以谋生1 天前
Python + Pytest + Allure 自动化测试报告教程
开发语言·python·pytest
叶子丶苏1 天前
第八节_PySide6基本窗口控件_按钮类控件(QAbstractButton)
python·pyqt
Larry_Yanan1 天前
QML学习笔记(四十四)QML与C++交互:对QML对象设置objectName
开发语言·c++·笔记·qt·学习·ui·交互
百锦再1 天前
对前后端分离与前后端不分离(通常指服务端渲染)的架构进行全方位的对比分析
java·开发语言·python·架构·eclipse·php·maven
Blossom.1181 天前
把AI“刻”进玻璃:基于飞秒激光量子缺陷的随机数生成器与边缘安全实战
人工智能·python·单片机·深度学习·神经网络·安全·机器学习
Kratzdisteln1 天前
【Python OOP Diary 1.1】题目二:简单计算器,改错与优化
python·面向对象编程
小白银子1 天前
零基础从头教学Linux(Day 53)
linux·运维·python