有发现问题一定请回复
在科创上许多都需要使用gui界面。虽然不知道大家用什么方式制作,但我自认为用Qt加python还是很好用的。
首先需要用到这个Qtcreator
打开后 文件>新建 >在左边那列选Qt然后右边选第三个点>“确定”
然后只要把左边那列的控件拖到中间你想要的相应位置即可
按Alt+Shift+R可以进行预览 ,全部弄完后保存得到一个 .ui 文件
最后就是将ui文件转为.py文件了。我的工具隆重登场!
"""
qt2py_release_v_1.3.py ui文件转Python代码
兼容PySide2 5.14.0及以下版本
"""
import os
import tkinter as tk
import traceback
from tkinter import filedialog, messagebox, ttk
import PySide2
class Qt2Py:
"""A class to convert ui file to Python codes."""
def __init__(self, src):
"""Full directories of a ui file."""
self.src = src
self.error_dir = os.path.join(os.path.dirname(__file__), "errors.txt")
def _handle_exception(self):
"""Save Exception infos to an file."""
with open(self.error_dir, 'a', encoding='utf-8') as f:
traceback.print_exc(file=f)
f.write('\n')
def _is_lower_version(self) -> bool:
"""
Check if current PySide2 version is lower than 5.14.0.
:return: comparsion result
"""
ps2_v, std_v = PySide2.__version__.split('.'), '5.14.0'.split('.')
len_ps2, len_std = len(ps2_v), len(std_v)
if len_ps2 > len_std:
std_v += ['0'] * (len_ps2 - len_std)
else:
ps2_v += ['0'] * (len_std - len_ps2)
for i in range(len(ps2_v)):
if int(ps2_v[i]) < int(std_v[i]):
return True
return False
def _generate_dst(self) -> str:
"""
Return a Python file name according to ui file.
:return: python file name
"""
src_dir, src_name = os.path.split(self.src)
return os.path.join(src_dir, f"ui_{os.path.splitext(src_name)[0]}.py")
def _qt2py_version_higher(self) -> bool:
"""
Convert higher version ui file to Python codes. Return bool.
:return: True for successful conversion False for failure.
"""
# 找到并切换到PySide2所在目录
os.chdir(os.path.dirname(PySide2.__file__))
# 生成python文件名
dst = self._generate_dst()
# 开始转换
if os.system(f'.{os.sep}uic {self.src} -g python -o {dst}'):
return False
else:
try:
with open(dst, encoding='utf-8') as f:
codes = f.read().replace('QString()', '""')
with open(dst, 'w', encoding='utf-8') as f:
f.write(codes)
return True
except Exception:
self._handle_exception()
return False
def _qt2py_version_lower(self) -> bool:
"""
Convert lower version ui file to Python codes. Return bool.
:return: True for successful conversion False for failure.
"""
# 生成python文件名
dst = self._generate_dst()
import pyside2uic
# 开始转换
try:
with open(dst, 'w', encoding='utf-8') as f:
pyside2uic.compileUi(self.src, f)
except Exception:
self._handle_exception()
return False
else:
return True
def qt2py(self) -> bool:
"""
Convert ui file to Python file according PySide2 version.
:return: True for successful conversion False for failure.
"""
if self._is_lower_version():
return self._qt2py_version_lower()
else:
return self._qt2py_version_higher()
class Ui_Qt2Py:
"""A class to create a GUI for file conversion."""
def __init__(self, master):
"""Set up attributes and GUI widgets."""
self.master = master
self.setup_Master()
self.setup_Ui()
self.bind_Method()
def setup_Master(self):
"""Adjustments to root window."""
self.master.resizable(False, False)
width = self.master.winfo_screenwidth()
height = self.master.winfo_screenheight()
self.master.geometry(f'340x240+{(width-340)//2}+{(height-240)//2}')
self.master.title('Qt Creator转换器')
def setup_Ui(self):
"""Add all widgets to root window."""
ttk.Label(
self.master, text='Qt Creator转换器', font=('Calibri', 20)
).place(anchor='center', relx=0.5, rely=0.15)
ttk.Label(
self.master, font=('Arial', 12),
text=f'PySide2 版本:{PySide2.__version__}'
).place(anchor='center', relx=0.5, rely=0.35)
self.btn_choose_file = ttk.Button(self.master, text='选择ui文件')
self.btn_choose_file.place(anchor='center', relx=0.275, rely=0.55,
relwidth=0.35, relheight=0.15)
self.btn_convert = ttk.Button(self.master, text='开始转换')
self.btn_convert.place(anchor='center', relx=0.725, rely=0.55,
relwidth=0.35, relheight=0.15)
self.file_path = ttk.Label(
self.master, text='请选择需要转换的ui文件……',
font=('Arial', 16), wraplength=320, anchor='center')
self.file_path.place(anchor='center', relx=0.5, rely=0.8, relwidth=1)
def _select_file(self, event=None):
"""Using file-selecting dialog to get ui file path."""
file_path = filedialog.askopenfilename(
title='打开文件', filetypes=[('Qt', '*.ui')])
if file_path:
self.file_path['text'] = file_path
def _convert_file(self, event=None):
"""Method to convert a ui file to Python codes."""
if not os.path.isfile(self.file_path['text']):
messagebox.showerror('文件错误', '请至少选择一个ui文件')
else:
q = Qt2Py(self.file_path['text'])
if q.qt2py():
messagebox.showinfo('转换结果', '转换成功')
else:
messagebox.showinfo('转换结果', '转换出错')
def _add_to_clipboard(self, event=None):
"""Add file path to clipboard."""
path = self.file_path['text']
if os.path.isfile(path):
self.master.clipboard_append(path)
messagebox.showinfo('操作结果', '路径已复制到剪贴板')
else:
messagebox.showinfo('操作结果', '未检测到有效文件路径')
def bind_Method(self):
"""Bind methods to GUI buttons."""
self.btn_choose_file['command'] = lambda: self._select_file()
self.btn_convert['command'] = lambda: self._convert_file()
self.master.bind_all('<Control-KeyPress-o>', self._select_file)
self.master.bind_all('<Control-KeyPress-e>', self._convert_file)
self.file_path.bind('<Double-Button-1>', self._add_to_clipboard)
def main():
"""Main entrance."""
root = tk.Tk()
Ui_Qt2Py(root)
root.mainloop()
if __name__ == "__main__":
main()
打包后有点大,就把python代码放这了,大家下好相应的库就可以直接运行。
后续内容请看下回分解!
[修改于 2年9个月前 - 2022/03/23 14:51:02]
对懒人来说,C/C++才是王道
服务器、上位机和各种单片机用同一套库,同一套API,不管多复杂的数据结构传输直接memcpy
pyQT也提供了一个编译的指令,也可以实现直接把ui文件转换成py文件,我的sublime自动编译指令配置如下:
{
"cmd": ["pyuic5", "-o", "${file_base_name}.py", "$file_name"],
"selector": "source.ui",
"working_dir": "$file_path",
}
CS出身,这个叫做qt的py绑定-pyqt.但是看到你的代码里又混入了另一套GUI框架-tkinter.。。有点换乱哦,单独用pyqt就行了。
多年前,用过Qt+Python的方式,几点看法:
1、非主流。资料太少了。
2、程序exe打包后,文件大,不便于传输。
python比较麻烦的就是依赖关系,虽然可以pip install
一把梭,但如果你手上的python项目多了,基本都需要virtual env来隔离不同的项目
引用celeron533发表于8楼的内容python比较麻烦的就是依赖关系,虽然可以pip install 一把梭,但如果你手上的pytho
现在就没见过不用venv或conda的,身边用conda的居多
200字以内,仅用于支线交流,主线讨论请采用回复功能。