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

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文件转换_第1张图片

你可能感兴趣的:(python,python,qt,ui,界面)