基于Python的GUI框架toolkit-frame介绍

简介: 基于Python的GUI框架toolkit-frame介绍

源码下载地址:https://download.csdn.net/download/zy0412326/12154342

链接:https://pan.baidu.com/s/1-s2WaQmV5bue8znirxWQ3Q 提取码:w0wo

学习Python一段时间,写了点东西。做了个GUI的小程序,和大家分享一下。这个小程序算不上框架,只是在工作过程中依据自己的需求编写的一个GUI小程序吧。使用了Python中WxPython技术,实现GUI可视化功能,目前在Windows和Mac OS上测试没有问题。Linux我相信也不会有问题,毕竟MacOS和Linux都是Unix内核。

先把使用的包给大家列举一下:Python 3.7、WxPython 4.0.4、pymysql、0.9.3、SQLAlchemy 1.2.17。其他的一些东西是Python自带的了这里就不再陈述。开发工具Pycharm专业版(估计社区版也可以)。

项目是按照传统ASP.NET的CodeBehand代码后置的方式设计的,即WxPython GUI代码和Python业务逻辑代码分离。也采用传统MVC模型,将各个层进行分离,实体类基于SQLAlchemy模型和用贫血模型进行编写。

下面给大家分享一下项目开发截图和程序运行的截图:

程序运行的截图:

接下来进入正题查阅每一层都是做什么的。

start层:负责GUI程序启动的类存放地点。仿照.NET WINFORM 的Program.cs类设计,在BootStrappy中进行GUI程序启动及配置的初始化。具体代码如下:

  1. import wx  
  2. from main.base.BaseConfig import BaseConfig  
  3. from main.controller.MainController import MainController  
  4.  
  5. if __name__ == '__main__':  
  6.    BaseConfig().__init_sys_config__() #初始化系统配置主要是sqlite数据库  
  7.    app = wx.App(False)  
  8.    controller = MainController()  
  9.    app.MainLoop()  
  10.    pass

 

View层:WxPython主要的代码。负责GUI的展示。MainView.py是项目的首页。首页包含日志菜单、日志显示区域、版权信息等。目前菜单还未进行权限的代码编写。下图是MainView.py的截图。

有个菜单核心方法initializeMenu(),新增的菜单都在这里体现,WxPython的菜单写法和JavaSwing的菜单写法非常类似。就连WxPython的部局和JavaSwing都非常类似。如果会JavaSwing学习WxPython基本无障碍。贴点代码给各位看看。

  1. def initializeMenu(self):  
  2.    self.menu_bar = wx.MenuBar()  # 创建软件的菜单wx是三方控件默认在Frame类中存在MenuBar为页面的主菜单  
  3.    # region 系统配置10  
  4.    sysmenu = wx.Menu()  # 创建子菜单软件菜单下的子菜单可以有多个和JavaSwing比较类似  
  5.    systemConfig = wx.MenuItem(sysmenu, wx.ID_SYSTEM_MENU, "系统配置")  # 生成一个菜单项  
  6.    systemConfig_png_path = Tools.get_resourcepath("resource") + os.sep + 'png' + os.sep + "cog.png"  
  7.    systemConfig.SetBitmap(wx.Bitmap(systemConfig_png_path))  
  8.    sysmenu.Append(systemConfig)  
  9.  
  10.    systemLog = wx.MenuItem(sysmenu, 1001, "系统日志")  
  11.    systemLog.SetBitmap(wx.Bitmap(Tools.get_resource_png_path() + os.sep + "clock_red.png"))  
  12.    sysmenu.Append(systemLog)  
  13.  
  14.    systemLogin = wx.MenuItem(sysmenu, 1002, "系统登录")  # 生成一个系统登录的菜单项  
  15.    systemLogin.SetBitmap(wx.Bitmap(Tools.get_resource_png_path() + os.sep + "user.png"))  
  16.    sysmenu.Append(systemLogin)  
  17.  
  18.    baidu_api_config = wx.MenuItem(sysmenu, 1003, "邮箱配置")  # 生成一个系统登录的菜单项  
  19.    baidu_api_config.SetBitmap(wx.Bitmap(Tools.get_resource_png_path() + os.sep + "email.png"))  
  20.    sysmenu.Append(baidu_api_config)  
  21.  
  22.    baidu_api_config = wx.MenuItem(sysmenu, 1004, "百度API配置")  # 生成一个系统登录的菜单项  
  23.    baidu_api_config.SetBitmap(wx.Bitmap(Tools.get_resource_png_path() + os.sep + "baidu.png"))  
  24.    sysmenu.Append(baidu_api_config)  
  25.  
  26.    systemClose = wx.MenuItem(sysmenu, wx.ID_EXIT, "关闭系统", "&Quit\tCtrl+Q")  # 生成一个关闭系统的菜单项  
  27.    systemClose.SetBitmap(wx.Bitmap(Tools.get_resource_png_path() + os.sep + "cancel.png"))  
  28.    sysmenu.Append(systemClose)  
  29.  
  30.    # menuBar.Append(sysmenu, "系统设置")  
  31.    # endregion  
  32.  
  33.    # region 帮助9  
  34.    helpMenu = wx.Menu()  
  35.    aboutMe = wx.MenuItem(helpMenu, wx.ID_ABOUT, "关于我们")  # 生成一个关于我们的菜单项  
  36.    aboutMe.SetBitmap(wx.Bitmap(Tools.get_resource_png_path() + os.sep + "contrast.png"))  
  37.    helpMenu.Append(aboutMe)  
  38.  
  39.    contracttUs = wx.MenuItem(helpMenu, 901, "联系我们")  # 生成一个联系我们的菜单项  
  40.    contracttUs.SetBitmap(wx.Bitmap(Tools.get_resource_png_path() + os.sep + "email.png"))  
  41.    helpMenu.Append(contracttUs)  
  42.  
  43.    opinionMenuItem = wx.MenuItem(helpMenu, 902, "意见反馈")  # 生成一个意见反馈的菜单项  
  44.    opinionMenuItem.SetBitmap(wx.Bitmap(Tools.get_resource_png_path() + os.sep + "bug.png"))  
  45.    helpMenu.Append(opinionMenuItem)  
  46.  
  47.    version_update = wx.MenuItem(helpMenu, 903, "版本检查")  
  48.    version_update.SetBitmap(wx.Bitmap(Tools.get_resource_png_path() + os.sep + "update.png"))  
  49.    helpMenu.Append(version_update)  
  50.    # menuBar.Append(helpMenu, "帮助")  
  51.    # endregion 帮助  
  52.  
  53.    self.menu_bar.Append(sysmenu, "系统设置")  
  54.    self.menu_bar.Append(helpMenu, "帮助")  
  55.    self.SetMenuBar(self.menu_bar)  # 创建菜单条  

 

其实整个View中最难的是多线程更新UI。这个东东就是会了不难,难了不会,我也被困扰好久后来找到API就写出来了,网络上由有用的信息很多,但是不写版本号这个让人很头疼。无论是是C#、Java还是Python都有这个问题让我深度无语。Wxpython多线程更新UI的样例:https://blog.csdn.net/seakingx/article/details/91807771。以后会例举个专题讲一讲。

version层:主要是检查当前程序是否有最新版本,该层负责链接远端服务器。

resource层:整个项目所有的资源存放地点。

plugin层:整个项目工具类存放地点。

object层:整个项目实体类和枚举类存放地点。

controller层:整个项目controller类存放地点。与view层对应,CodeBehand代码。根据实际项目需要,如果需要写业务层则增加business层与之对接即可。不需要直接在controller中写业务代码。

base层:整个项目基础类存放地点。包含

  1. BaseConfig.py系统配置类,主要是路径配置,兼容mac和win。系统第一次安装的时候会把系统数据库(sqlite3)初始化到指定的目录。具体代码:
  2. import os  
  3. import getpass  
  4. from main.plugin.Tools import Tools  
  5.  
  6.  
  7. class BaseConfig:  
  8.    # region 窗体变量  
  9.    INT_LOG_FILE_PATH = ""  
  10.    LOG_FILE_NAME = "toolkit-frame.log"  
  11.    LOG_FILE_PATH = "/Users/zhangyu/LandSea/"  
  12.    SOFT_VERSION = "AiToolkit"  
  13.    FILE_NAME = "toolkit.sqlite"  
  14.  
  15.    # endregion  
  16.  
  17.    # region 构造函数  
  18.    def __init__(self):  
  19.        resource_db = Tools.get_resourcepath("resource") + os.sep + "db" + os.sep + self.FILE_NAME  
  20.  
  21.        if Tools.get_os_name() == "WIN":  
  22.            self.IS_LUX_OS = False  
  23.            self.IS_MAC_OS = False  
  24.            self.IS_WIN_OS = True  
  25.            self.CORPUS_ROOT = 'D:\\Landsea\\Train\\Corpus'  # 语料库根路径  
  26.            self.ROOT_PATH = "C:\\Users\\" + getpass.getuser() + "\\AppData\\Local\\" + self.SOFT_VERSION + "\\"  
  27.            self.TEMP_PATH = "C:\\Users\\" + getpass.getuser() + "\\AppData\\Local\\" + self.SOFT_VERSION + "\\Temp\\"  
  28.        elif Tools.get_os_name() == "OS":  
  29.            self.IS_LUX_OS = False  
  30.            self.IS_MAC_OS = True  
  31.            self.IS_WIN_OS = False  
  32.            self.CORPUS_ROOT = '/Users/zhangyu/Corpus'  
  33.            self.ROOT_PATH = "/Users/" + getpass.getuser() + "/AppData/Local/" + self.SOFT_VERSION + "/"  
  34.            self.TEMP_PATH = "/Users/" + getpass.getuser() + "/AppData/Local/" + self.SOFT_VERSION + "/Temp/"  
  35.        elif Tools.get_os_name() == "LUX":  
  36.            self.IS_LUX_OS = True  
  37.            self.IS_MAC_OS = False  
  38.            self.IS_WIN_OS = False  
  39.            self.CORPUS_ROOT = '/Users/zhangyu/Corpus'  
  40.            self.ROOT_PATH = "/Users/" + getpass.getuser() + "/AppData/Local/" + self.SOFT_VERSION + "/"  
  41.            self.TEMP_PATH = "/Users/" + getpass.getuser() + "/AppData/Local/" + self.SOFT_VERSION + "/Temp/"  
  42.        else:  
  43.            self.IS_LUX_OS = False  
  44.            self.IS_MAC_OS = False  
  45.            self.IS_WIN_OS = False  
  46.            pass  
  47.        Tools.judge_diskpath_exits_create(self.ROOT_PATH)  
  48.        Tools.judge_diskpath_exits_create(self.TEMP_PATH)  
  49.        GLOBAL_CONFIG_PATH_NAME = self.ROOT_PATH + self.FILE_NAME  
  50.        if os.path.exists(GLOBAL_CONFIG_PATH_NAME):  
  51.            pass  
  52.        else:  
  53.            Tools.copy_file_to_disk(resource_db, GLOBAL_CONFIG_PATH_NAME)  
  54.        if Tools.judge_is_exits_network():  
  55.            self.EXITS_NET = True  
  56.        else:  
  57.            self.EXITS_NET = False  
  58.  
  59.    # endregion  
  60.  
  61.    # region 初始化系统配置文件 zhangyu-2019-5-25  
  62.    def __init_sys_config__(self):  
  63.        resource_db = Tools.get_resourcepath("resource") + os.sep + "db" + os.sep + self.FILE_NAME  
  64.        if Tools.get_os_name() == "WIN":  
  65.            self.IS_WIN_OS = True  
  66.            GLOBAL_CONFIG_PATH_NAME = self.ROOT_PATH + self.FILE_NAME  
  67.            Tools.judge_diskpath_exits_create(self.ROOT_PATH)  
  68.            Tools.judge_diskpath_exits_create(self.TEMP_PATH)  
  69.            if os.path.exists(GLOBAL_CONFIG_PATH_NAME):  
  70.                return  
  71.            else:  
  72.                Tools.copy_file_to_disk(resource_db, GLOBAL_CONFIG_PATH_NAME)  
  73.                return  
  74.            pass  
  75.        elif Tools.get_os_name() == "OS":  
  76.            self.IS_MAC_OS = True  
  77.            GLOBAL_CONFIG_PATH_NAME = self.ROOT_PATH + self.FILE_NAME  
  78.            Tools.judge_diskpath_exits_create(self.ROOT_PATH)  
  79.            Tools.judge_diskpath_exits_create(self.TEMP_PATH)  
  80.  
  81.            if os.path.exists(GLOBAL_CONFIG_PATH_NAME):  
  82.                return  
  83.            else:  
  84.                Tools.copy_file_to_disk(resource_db, GLOBAL_CONFIG_PATH_NAME)  
  85.                return  
  86.        elif Tools.get_os_name() == "LUX":  
  87.            self.IS_LUX_OS = True  
  88.            Tools.judge_diskpath_exits_create(self.ROOT_PATH)  
  89.            Tools.judge_diskpath_exits_create(self.TEMP_PATH)  
  90.            pass  
  91.        pass  
  92.    # endregion  

 

  1. BaseController.py Controller的基类。集成了系统配置类(BaseConfig.py),同时读取系统参数。

 

  1. from main.access.sys.SysConfigAccess import SysConfigAccess  
  2. from main.base.BaseConfig import BaseConfig  
  3.  
  4.  
  5. class BaseController(BaseConfig):  
  6.  
  7.    def __init__(self):  
  8.        self.sys_list = SysConfigAccess().find_all()  
  9.        for entity in self.sys_list:  
  10.            if entity.parameter_key == "SOFT_NAME":  
  11.                self.soft_subject = entity.parameter_value  
  12.            if entity.parameter_key == "AUTO_TIME":  
  13.                self.auto_time = entity.parameter_value  
  14.            if entity.parameter_key == "CONFIG_PATH":  
  15.                self.config_path = (entity.parameter_value)  
  16.            if entity.parameter_key == "IS_TRANS":  
  17.                if entity.parameter_value == "1":  
  18.                    self.is_auto_excute = True  
  19.                else:  
  20.                    self.is_auto_excute = False  
  21.            if entity.parameter_key == "IS_SHOW_FRAME":  
  22.                if entity.parameter_value == "1":  
  23.                    self.is_show_pop_win = True  
  24.                else:  
  25.                    self.is_show_pop_win = False  
  26.            if entity.parameter_key == "IS_SPRIDER":  
  27.                if entity.parameter_value == "1":  
  28.                    self.is_auto_sprider = True  
  29.                else:  
  30.                    self.is_auto_sprider = False  
  31.            if entity.parameter_key == "TEMP_PATH":  
  32.                self.temp_path = (entity.parameter_value)  
  33.        pass  
  34. BaseEntity.py
  35. BaseFrame.py
  36. MySqlAccess.py
  37. SqliteAccess.py

access层:整个项目数据访问类存放地点。主要是controller访问。

最后介绍requirements.txt文件。这里面是我使用的所有包。各位根据需要自己增加需要的包,

 

 

目录
相关文章
|
11天前
|
中间件 数据库连接 API
Python面试:FastAPI框架原理与实战
【4月更文挑战第18天】FastAPI是受欢迎的高性能Python Web框架,以其简洁的API设计、强大的类型提示和优秀的文档生成能力著称。本文将探讨FastAPI面试中的常见问题,包括路由、响应对象、Pydantic模型、数据库操作、中间件和错误处理。同时,还会指出一些易错点,如类型提示不准确、依赖注入误解,并提供实战代码示例。通过理解和实践FastAPI,可以在面试中展示出色的Web开发技能。
24 1
|
11天前
|
API 数据库 数据安全/隐私保护
Flask框架在Python面试中的应用与实战
【4月更文挑战第18天】Django REST framework (DRF) 是用于构建Web API的强力工具,尤其适合Django应用。本文深入讨论DRF面试常见问题,包括视图、序列化、路由、权限控制、分页过滤排序及错误处理。同时,强调了易错点如序列化器验证、权限认证配置、API版本管理、性能优化和响应格式统一,并提供实战代码示例。了解这些知识点有助于在Python面试中展现优秀的Web服务开发能力。
24 1
|
3天前
|
缓存 前端开发 安全
Python web框架fastapi中间件的使用,CORS跨域详解
Python web框架fastapi中间件的使用,CORS跨域详解
|
3天前
|
API 数据库 Python
Python web框架fastapi数据库操作ORM(二)增删改查逻辑实现方法
Python web框架fastapi数据库操作ORM(二)增删改查逻辑实现方法
|
3天前
|
关系型数据库 MySQL API
Python web框架fastapi数据库操作ORM(一)
Python web框架fastapi数据库操作ORM(一)
|
3天前
|
Python
python web框架fastapi模板渲染--Jinja2使用技巧总结
python web框架fastapi模板渲染--Jinja2使用技巧总结
|
3天前
|
开发框架 网络协议 前端开发
Python高性能web框架--Fastapi快速入门
Python高性能web框架--Fastapi快速入门
|
3天前
|
网络协议 数据库 开发者
构建高效Python Web应用:异步编程与Tornado框架
【4月更文挑战第29天】在Web开发领域,响应时间和并发处理能力是衡量应用性能的关键指标。Python作为一种广泛使用的编程语言,其异步编程特性为创建高性能Web服务提供了可能。本文将深入探讨Python中的异步编程概念,并介绍Tornado框架如何利用这一机制来提升Web应用的性能。通过实例分析,我们将了解如何在实际应用中实现高效的请求处理和I/O操作,以及如何优化数据库查询,以支持更高的并发用户数和更快的响应时间。
|
5天前
|
IDE 测试技术 持续交付
【专栏】Python自动化测试与单元测试框架:提升代码质量与效率
【4月更文挑战第27天】本文探讨了Python自动化测试与单元测试框架在提升代码质量与效率中的作用。Selenium、Appium用于Web和移动应用自动化测试,pytest提供强大、易扩展的测试支持。unittest是Python标准的单元测试框架,支持结构化测试用例和丰富的断言。实践中,应制定测试计划,编写高质量测试用例,实行持续集成与测试,并充分利用测试报告。这些工具和策略能有效保障代码质量和提升开发效率。
|
5天前
|
测试技术 API 持续交付
【专栏】Python自动化测试与单元测试框架
【4月更文挑战第27天】本文探讨了Python在自动化测试与单元测试中的应用,强调其简洁语法和丰富库的优势。文章分为三部分:首先,阐述自动化测试的重要性及Python的易学性、库支持、跨平台和社区支持;其次,介绍了Python的Unittest标准测试框架和Pytest第三方框架的特点与用法;最后,讨论了Web UI和API自动化测试实践,并提出持续集成、测试金字塔等最佳实践。Python为软件开发的测试环节提供了强大支持,帮助构建更稳定的系统。