欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

8行代码实现ui文件到py文件转换

程序员文章站 2022-06-15 14:21:55
...

8行代码实现ui文件到py文件转换

在用PyQt进行GUI编程时,一般先通过Qt Designer产生后缀为.ui的UI文件(类似于XML文件),接着将.ui文件转换成.py文件,再通过一个python主程序调用这个.py文件,实现界面按钮与动作的关联。

将.ui转换为.py一般是通过命令行,如果电脑上安装了Eric 6,也可以用Eric转换,但最通用的还是命令行方法。其语法为

pyuic5 -o mypy.py myui.ui

但是,当有大量ui文件时,最好能用一个脚本进行处理,省时省力还不容易出错,用老司机的话这就叫DRY原则(Don’t repeat yourself)。

程序代码如下:

import os

path = r"D:\python3_dev\test_ui2py"

def ui2py(path):
    uilist = [os.path.join(path, f) for f in os.listdir(path) if f.endswith('.ui')]
    pylist = [os.path.splitext(uifile)[0]+".py" for uifile in uilist]
    [os.system("pyuic5 -o {pyfile} {uifile}".format(pyfile=py, uifile=ui)) for py, ui in zip(pylist, uilist)]

if __name__ == "__main__":
    ui2py(path)

通过命令os.listdir(path)查看文件夹里有哪些文件。

运行前,文件夹里有四个文件,如下。

['test1.ui', 'test2.ui', 'test3.ui', 'test4.txt']

运行完毕后,文件夹里每个.ui文件都出现了一个.py文件,如下所示。

['test1.py',
 'test1.ui',
 'test2.py',
 'test2.ui',
 'test3.py',
 'test3.ui',
 'test4.txt']

这个程序用到了python非常强大的列表表达式(list comprehension)功能。要注意三点:
1. 最好在path字符串前加上rRpath = r"D:\python3_dev\test_ui2py"表示赋给path变量的是字符串的字面值(String literals),即看见什么就表示什么,比如反斜杠"\"只是反斜杠而已,不会起转义作用(众所周知,python里反斜杠是个转义字符,比如\n表示换行,行尾\表示续行);
2. 最好用os.path.join(path, filename)的方式连接路径和文件名。不要用+号连接,因为需要额外提供反斜杠才行,比如path+r"\file.py",或path=r"D:\python3_dev\test_ui2py\", path + r"file.py",其实后一种方式会报错,提示行尾(EOL)不能出现反斜杠,尽管已经用了r,然并卵。深入的原因不知道,难道是python程序的一个不合理之处?所以,就用join吧!更加pythonic。
3. 判断一个文件的后缀时,尽量用if filename.endswith(".suffix")语法,不要用if os.path.splitext(filename)[1] == ".suffix"。前一种方式更简洁更pythonic。
4. 对于简单的循环,尽量使用列表表达式,更快速,用for循环的话语法冗长而且效率低下。如果数据量很大,考虑用生成器(generator),这样一来数据就不会一下子全堆进内存。只要把列表表达式的方括号换成圆括号即可,比如pygen = (os.path.splitext(uifile)[0]+".py" for uifile in uilist)。但是在程序代码里当我用生成器时,只产生了test1.py,问题有待查明。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(内容同步更新到微信公众号python数学物理,微信号python_math_physics
8行代码实现ui文件到py文件转换