帆域
帆域
帆域
帆域
帆域

Pycharm PySide6 外部工具配置进阶

为什么要有这篇文章?

网络上关于Pycharm、PySide6的教程已经有非常非常多,接近于饱和,唯一的问题在于它们的重复性太高,而重复性高是好事也不是好事。

好事好在大家很轻松就能得到一个基本的解决方案;不好就坏在一旦我们需要更多的知识,基本的解决方案就不够用了……

恰好最近芒果说过要分享一下PySide项目开发经验来着,所以我来填坑了……

近期网站建设规划-帆域
近期网站建设规划-帆域
芒果帆帆🥭的头像-帆域帆域超级会员9月8日 13:17
038028

本文的主要针对对象:Pycharm与PySide6开发有关的外部工具

参考资料:下图与其他众多网络资源,数量太多无法枚举啦

图片[1]-Pycharm PySide6 外部工具配置进阶
你怎么知道那一本就是我借的()

前置芝士🧀

文件拓展名大学习:

  • py是Python源文件的拓展名,我们习惯于称之:Python源文件、Python源代码文件、Python可执行脚本、……,总之随便称呼吧,开心就好。
  • ui是Qt的设计师文件,一个ui文件就是一个窗口的设计,在Qt C++和PySide/PyQt中都是如此。
    • 内部是XML结构。
  • qrc是Qt的资源文件,一个qrc文件中可以包含许多文件(比如代码中用到的图片文件),PySide会将其中列出的文件转写为二进制代码,一般命名为resource.pyresource_rc.py,以供使用这些文件的Python源文件直接import。这是Qt的资源系统而非Python的资源系统,好处在于可以将使用到的图片等资源写在源码中分发,省事。
    • 内部是XML结构。
  • pro是Qt的项目配置文件,主要在Qt C++中使用,在PySide开发中实际上不怎么需要,但是对于中等规模及更大的项目的维护管理还是比较有用的,比如做多语言国际化的时候。
  • qssQt层叠样式表,没错很类似于前端开发中的css,语法也差不多,如果不在意样式的话不用编写qss也能完成开发。
  • ts是语言文件,即翻译文件。通常每一个语言都会有一个该语言的ts文件,使用语言家编辑此文件可实现翻译该Qt或PySide项目。
    • 内部是XML结构。
  • qm是发布后的语言文件,是二进制文件,由ts文件生成,每个ts都会生成一个自己的qm,存有一个语言的所有翻译。

Qt是C++平台上知名的窗口库,Pyside和PyQt都是其在Python上的移植。PyQt有5和6两个版本,PySide有2和6两个版本,本文的主要针对对象是PySide6,芒果目前安装的是PySide6 6.7,至于为何不是最新的6.8?请看VCR……

与PySide6配套的Qt工具

图片[2]-Pycharm PySide6 外部工具配置进阶

新建虚拟环境,pip install PySide6,然后进入虚拟环境的Scripts目录,可以找到如上的这么多以pyside6开头的exe,这些就是我们在开发过程中的强力助手。当然我们并不需要使用每一个工具,这些工具分别是干什么用的亦能通过名字推断出来,我们需要重点配置的无非就是设计师uicrcc,以及如果项目涉及到多语言、国际化的话,加上lupdate语言家即可。

如果你对这个跟在每个家伙后面的exe是什么比较感兴趣,参见这篇文章……

设计师(pyside6-designer.exe

设计师(Designer直译)是Qt的可视化窗口设计工具。在Qt C++中的QtCreator可能是极为高效的可视化窗口设计+项目管理+代码编写一体化,但是在PySide6开发中,我们为了选择Python而对这种一体化做出了让步。

本文不在此赘述设计师的使用方法。但是,我们可以将设计师添加为Pycharm的外部工具,从而让我们快速调用设计师打开任何ui文件。

图片[3]-Pycharm PySide6 外部工具配置进阶
效果,在左侧文件浏览窗口中选中一个ui文件,右键,选择外部工具Designer即可打开并开始设计窗口。
图片[4]-Pycharm PySide6 外部工具配置进阶
添加外部工具,名称、组和描述都可以随意填写,程序选择刚刚找到的pyside6-designer.exe,实惨选择$FilePath$,工作目录实际上可以随意选择或保持默认。

我的上图设置即,在选中文件并调用Qt组中的工具Designer时,将选中的文件的路径传给pyside6-designer.exe,从而使用设计师打开该ui文件。

设计师的具体使用方法很多,这里不做详细介绍。

UIC(pyside6-uic.exe

如何在我们的Python代码中使用设计师设计好的窗口?我们需要UIC工具将ui文件转换成py文件,然后import。

图片[5]-Pycharm PySide6 外部工具配置进阶
同设计师类似设置后,会发现UIC工具在控制台中输出了转换得到的Python代码。
图片[6]-Pycharm PySide6 外部工具配置进阶
将实参设置为$FilePath$ -o $FileNameWithoutExtension$.py,增加-o意味着将输出保存到传入的文件的不带拓展名的名字+拓展名.py中,即可实现在同目录下生成转换过的py文件。
图片[7]-Pycharm PySide6 外部工具配置进阶
图片[8]-Pycharm PySide6 外部工具配置进阶

如何使用得到的py文件不在本文的讨论范围内,相信大家多少都学会使用它们的方法了……吧。

RCC(pyside6-rcc.exe

此工具根据qrc文件生成py文件,然后导入该py文件即可使用写入qrc中的所有资源。此处简单带过qrc文件的语法,重点仍然在Pycharm外部工具的配置。

<RCC>
    <qresource prefix="/app">
        <file>images/icons/SettingsFilled_white.svg</file>
        <file>images/icons/SettingsFilled_black.svg</file>
        <file>images/icons/Settings_white.svg</file>
        <file>images/icons/Settings_black.svg</file>
        <file>images/logo.png</file>
        <file>images/background.jpg</file>
        <file>images/avatar.png</file>

        <file>i18n/app.zh_CN.qm</file>
        <file>i18n/app.zh_HK.qm</file>

        <file>qss/light/setting_interface.qss</file>
        <file>qss/dark/setting_interface.qss</file>
        <file>qss/global.qss</file>

        <file>texts/main_tip.md</file>
        <file>texts/about_tip.md</file>

        <file>images/icons/IconDownload.png</file>
        <file>images/icons/IconHash.png</file>
        <file>images/icons/IconTranslate.png</file>
        <file alias="IconPython">images/icons/IconPython.svg</file>
        <file alias="IconPySide">images/icons/IconQt.svg</file>
        <file alias="IconFluent">images/icons/IconQFluentWidgets.png</file>
        <file alias="IconDocs">images/icons/IconHtml.svg</file>
        <file alias="IconGitHub">images/icons/IconGitHub.svg</file>
        <file alias="IconRelease">images/icons/IconFanSpace.png</file>
        <file>images/payQRcode.png</file>
    </qresource>
</RCC>
图片[9]-Pycharm PySide6 外部工具配置进阶
实参填写$FileName$ -o resource.py,意为输出resources.py文件,该文件中就写入了所有qrc中添加的文件的二进制内容,包括所有你添加的文件,因此这个py文件可能会有点大。

转换后得到的resource.py同上一个UIC一样会在同一目录下,然后只需要import resource即可使用其中的文件了。关于这套Qt的资源系统的详细介绍不在本文包含范围内。

lupdate(pyside6-lupdate.exepylupdate5.exe

从这里开始是多语言国际化的部分!

所有继承了QObject的类都有self.tr方法,示例:将self.label.setText("Hello PySide~")更改为self.label.setText(self.tr("Hello PySide~")),即可添加字符串Hello PySide~为可翻译字符串。

此外,你也可以像UIC工具转换出的py文件一样,使用更底层的QtCore.QCoreApplication.translate来实现类似的效果。

可翻译字符串在存在对应语言的翻译文件(qm文件),并且翻译中该字符串被翻译的时候,会以翻译后的本地文本的形式显示在GUI中,示例:在"Hello PySide~"被翻译为"你好,PySide!",并且该ts文件已经被发布为qm文件,并且加载了该qm文件后,self.label.setText(self.tr("Hello PySide~"))等效于self.label.setText("你好,PySide!")。无论是没有该语言的翻译文件,还是该语言的翻译文件中不包括这句可翻译字符串,都会使其显示self.tr中的原文本。

lupdate文件的作用正是从py源文件中查找可翻译字符串,并将其提取出来,生成ts翻译文件以供翻译。

然而,对于一个比较大型的PySide6项目,芒果从主观角度更建议使用PyQt5中起同样作用的pylupdate5.exe,原因包含我们一开始介绍到的pro文件:

SOURCES += app/common/hitokoto.py \
        app/view/main_window.py \
        app/view/setting_interface.py \
        app/view/register_window.py \
        app/view/main_interface.py \
        app/view/tool_interface.py \
        app/view/about_interface.py \
        app/view/widgets/tool_widget.py \
        app/view/widgets/tool_info_box.py \
        app/view/widgets/account_edit_info_box.py \
        app/view/widgets/need_update_info_bar.py \
        tool/hashCalculator/widgets/file_hash_widget.py \
        tool/hashCalculator/widgets/file_hash_info_box.py \
        tool/hashCalculator/run.py \
        tool/bilingualWriting/widgets/settings_info_box.py \
        tool/bilingualWriting/widgets/tr_api.py \
        tool/bilingualWriting/run.py \

TRANSLATIONS += app/resource/i18n/app.zh_CN.ts \
                app/resource/i18n/app.zh_HK.ts

以上是芒果工具箱重构之后,新的项目使用的main.pro文件,由于PySide项目不需要很多Qt C++中的配置项,所以这个pro中仅有SOURCESTRANSLATIONS,分别是所有包含可翻译字符串的源文件,和所有翻译文件。

根据Qt论坛中How to use pyside6-lupdate? | Qt Forum的说法,PySide6的lupdate已经不再支持根据pro文件中的上述内容一键生成所有语言的ts翻译文件,所以在我的Pycharm中使用的是PyQt5提供的pylupdate5.exe,配置如下。

图片[10]-Pycharm PySide6 外部工具配置进阶
实参为文件名称,意味着选中pro文件(比如我就需要选中main.pro),运行该外部工具即可从所有列出的py源文件中查找可翻译字符串,并生成我需要的两种语言的ts翻译文件。加上我在GUI中使用英语作为原文本,实际上的程序可以支持三种显示语言(不过我还没有翻译繁中就是喽)

除了pro文件支持外,这两个lupdate都可以根据一个py文件生成一个ts文件,也可以根据多个py文件生成多个ts文件,但是这需要冗长的控制台指令,而我倾向于简单化,比如提前写好一个pro然后直接右键用工具。

语言家(pyside6-linguist.exe

图片[11]-Pycharm PySide6 外部工具配置进阶
图片[12]-Pycharm PySide6 外部工具配置进阶

语言家可以对生成的ts文件进行翻译,翻译时可以实时查看该字符串在源码中的位置。ts文件本身不存储源码,只存储对应的可翻译字符串在源码中出现的位置,这意味着如果你在生成ts文件之后又修改了源码,翻译家可能就无法找到字符串所处的位置了。

翻译进度会存储在ts文件里;不过,你可以在源码更新后放心执行lupdate,这不会覆盖你已有的翻译成果。

语言家翻译完成后,通过菜单栏中的文件>发布,可以生成对应该ts文件的qm文件,后者就可以被Qt加载,从而为GUI程序提供对应语言的翻译了。

图片[13]-Pycharm PySide6 外部工具配置进阶

然后将qm文件添加到qrc里,运行RCC得到resource.py,就可以将qm翻译文件存储在Python代码里,方便程序打包分发。Qt多语言国际化的详细操作也不在本文的讨论范围内。

下班收工!

换了新电脑,重新配置环境,重拾了来自开学之前淡忘已久的回忆,所以赶紧记录一下防止自己以后再接着忘记……

© 版权声明
THE END
喜欢就支持一下吧
点赞40赞赏 分享
评论 抢沙发

请登录后发表评论

    请登录后查看评论内容