基于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文件。这里面是我使用的所有包。各位根据需要自己增加需要的包,

 

 

目录
相关文章
|
1月前
|
安全 前端开发 数据库
Python 语言结合 Flask 框架来实现一个基础的代购商品管理、用户下单等功能的简易系统
这是一个使用 Python 和 Flask 框架实现的简易代购系统示例,涵盖商品管理、用户注册登录、订单创建及查看等功能。通过 SQLAlchemy 进行数据库操作,支持添加商品、展示详情、库存管理等。用户可注册登录并下单,系统会检查库存并记录订单。此代码仅为参考,实际应用需进一步完善,如增强安全性、集成支付接口、优化界面等。
|
3月前
|
测试技术 开发者 Python
Python(GUI)之活动积分记录表
本文介绍了一套使用Python的Tkinter库构建的学生活动积分记录系统。该系统允许教师选择班级和学生,输入加分分数及原因,并将数据保存至文件,旨在简化学生积分管理流程,提升教学效率。
73 6
|
3月前
|
数据采集 存储 JSON
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第27天】本文介绍了Python网络爬虫Scrapy框架的实战应用与技巧。首先讲解了如何创建Scrapy项目、定义爬虫、处理JSON响应、设置User-Agent和代理,以及存储爬取的数据。通过具体示例,帮助读者掌握Scrapy的核心功能和使用方法,提升数据采集效率。
193 6
|
22天前
|
人工智能 开发者 Python
Chainlit:一个开源的异步Python框架,快速构建生产级对话式 AI 应用
Chainlit 是一个开源的异步 Python 框架,帮助开发者在几分钟内构建可扩展的对话式 AI 或代理应用,支持多种工具和服务集成。
137 9
|
1月前
|
JSON 安全 中间件
Python Web 框架 FastAPI
FastAPI 是一个现代的 Python Web 框架,专为快速构建 API 和在线应用而设计。它凭借速度、简单性和开发人员友好的特性迅速走红。FastAPI 支持自动文档生成、类型提示、数据验证、异步操作和依赖注入等功能,极大提升了开发效率并减少了错误。安装简单,使用 pip 安装 FastAPI 和 uvicorn 即可开始开发。其优点包括高性能、自动数据验证和身份验证支持,但也存在学习曲线和社区资源相对较少的缺点。
84 15
|
1月前
|
关系型数据库 API 数据库
Python流行orm框架对比
Python中有多个流行的ORM框架,如SQLAlchemy、Django ORM、Peewee、Tortoise ORM、Pony ORM、SQLModel和GINO。每个框架各有特点,适用于不同的项目需求。SQLAlchemy功能强大且灵活,适合复杂项目;Django ORM与Django框架无缝集成,易用性强;Peewee轻量级且简单,适合小型项目;Tortoise ORM专为异步框架设计;Pony ORM查询语法直观;SQLModel结合Pydantic,适合FastAPI;GINO则适合异步环境开发。初学者推荐使用Django ORM或Peewee,因其易学易用。
|
1月前
|
人工智能 分布式计算 大数据
MaxFrame 产品评测:大数据与AI融合的Python分布式计算框架
MaxFrame是阿里云MaxCompute推出的自研Python分布式计算框架,支持大规模数据处理与AI应用。它提供类似Pandas的API,简化开发流程,并兼容多种机器学习库,加速模型训练前的数据准备。MaxFrame融合大数据和AI,提升效率、促进协作、增强创新能力。尽管初次配置稍显复杂,但其强大的功能集、性能优化及开放性使其成为现代企业与研究机构的理想选择。未来有望进一步简化使用门槛并加强社区建设。
80 7
|
2月前
|
JSON 数据可视化 测试技术
python+requests接口自动化框架的实现
通过以上步骤,我们构建了一个基本的Python+Requests接口自动化测试框架。这个框架具有良好的扩展性,可以根据实际需求进行功能扩展和优化。它不仅能提高测试效率,还能保证接口的稳定性和可靠性,为软件质量提供有力保障。
96 7
|
2月前
|
分布式计算 大数据 数据处理
技术评测:MaxCompute MaxFrame——阿里云自研分布式计算框架的Python编程接口
随着大数据和人工智能技术的发展,数据处理的需求日益增长。阿里云推出的MaxCompute MaxFrame(简称“MaxFrame”)是一个专为Python开发者设计的分布式计算框架,它不仅支持Python编程接口,还能直接利用MaxCompute的云原生大数据计算资源和服务。本文将通过一系列最佳实践测评,探讨MaxFrame在分布式Pandas处理以及大语言模型数据处理场景中的表现,并分析其在实际工作中的应用潜力。
116 2
|
3月前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
269 45

热门文章

最新文章

推荐镜像

更多