所有教程由网友发布,仅供参考,请谨慎采纳。科创不对教程的科学性、准确性、可靠性负责。
使用Qt及python实现可视化gui设计(1)
XZH100 2022-3-23原创 软件综合
关键词
pythonguiQt软件设计编程
pythonguiQt

在科创上许多都需要使用gui界面。虽然不知道大家用什么方式制作,但我自认为用Qt加python还是很好用的。

首先需要用到这个Qtcreator

捕获.png

打开后 文件>新建 >在左边那列选Qt然后右边选第三个点>“确定”

捕获.png

然后只要把左边那列的控件拖到中间你想要的相应位置即可

按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代码放这了,大家下好相应的库就可以直接运行。

后续内容请看下回分解!😀


来自:计算机科学 / 软件综合严肃内容:教程/课程
6
1
XZH100 作者
2个月6天前
1楼

有发现问题一定请回复

引用
评论(1)
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
amo
2个月6天前
2楼

对懒人来说,C/C++才是王道

服务器、上位机和各种单片机用同一套库,同一套API,不管多复杂的数据结构传输直接memcpy

引用
评论(1)
1
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
amo
2个月6天前
3楼
当然如果只是在电脑上运行,C/C++就显得开发效率不高了,排名基本上就是末尾位置
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
该用户不需要名字
2个月6天前
4楼

pyQT也提供了一个编译的指令,也可以实现直接把ui文件转换成py文件,我的sublime自动编译指令配置如下:

{

"cmd": ["pyuic5", "-o", "${file_base_name}.py", "$file_name"],

"selector": "source.ui",

"working_dir": "$file_path",

}


引用
评论(2)
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
XZH100作者
2个月6天前
5楼
引用该用户不需要名字发表于4楼的内容
pyQT也提供了一个编译的指令,也可以实现直接把ui文件转换成py文件,我的sublime自动编译指...

好,了解了一个新知识

引用
评论
1
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
kearney
1个月23天前
6楼

CS出身,这个叫做qt的py绑定-pyqt.但是看到你的代码里又混入了另一套GUI框架-tkinter.。。有点换乱哦,单独用pyqt就行了。

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
所属分类
上级专业
同级专业
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
插入资源
全部
图片
视频
音频
附件
全部
未使用
已使用
正在上传
空空如也~
上传中..{{f.progress}}%
处理中..
上传失败,点击重试
等待中...
{{f.name}}
空空如也~
(视频){{r.oname}}
{{selectedResourcesId.indexOf(r.rid) + 1}}
处理中..
处理失败
插入表情
我的表情
共享表情
Emoji
上传
注意事项
最大尺寸100px,超过会被压缩。为保证效果,建议上传前自行处理。
建议上传自己DIY的表情,严禁上传侵权内容。
点击重试等待上传{{s.progress}}%处理中...已上传,正在处理中
空空如也~
处理中...
处理失败
加载中...
草稿箱
加载中...
此处只插入正文,如果要使用草稿中的其余内容,请点击继续创作。
{{fromNow(d.toc)}}
{{getDraftInfo(d)}}
标题:{{d.t}}
内容:{{d.c}}
继续创作
删除插入插入
{{forum.displayName}}
{{forum.countThreads}}
篇文章,
{{forum.countPosts}}
条回复
{{forum.description || "暂无简介"}}
ID: {{user.uid}}
学术分隐藏
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

支持的图片格式:jpg, jpeg, png
插入公式
分享回复:{{shareId}}
加载中...
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
加入关注取消关注
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
建议修改
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也