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字符串前加上r或R。path = 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)