基于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
Python(GUI)之活动积分记录表
本文介绍了一套使用Python的Tkinter库构建的学生活动积分记录系统。该系统允许教师选择班级和学生,输入加分分数及原因,并将数据保存至文件,旨在简化学生积分管理流程,提升教学效率。
54 6
|
1月前
|
数据采集 存储 JSON
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第27天】本文介绍了Python网络爬虫Scrapy框架的实战应用与技巧。首先讲解了如何创建Scrapy项目、定义爬虫、处理JSON响应、设置User-Agent和代理,以及存储爬取的数据。通过具体示例,帮助读者掌握Scrapy的核心功能和使用方法,提升数据采集效率。
114 6
|
10天前
|
JSON 数据可视化 测试技术
python+requests接口自动化框架的实现
通过以上步骤,我们构建了一个基本的Python+Requests接口自动化测试框架。这个框架具有良好的扩展性,可以根据实际需求进行功能扩展和优化。它不仅能提高测试效率,还能保证接口的稳定性和可靠性,为软件质量提供有力保障。
37 7
|
8天前
|
分布式计算 大数据 数据处理
技术评测:MaxCompute MaxFrame——阿里云自研分布式计算框架的Python编程接口
随着大数据和人工智能技术的发展,数据处理的需求日益增长。阿里云推出的MaxCompute MaxFrame(简称“MaxFrame”)是一个专为Python开发者设计的分布式计算框架,它不仅支持Python编程接口,还能直接利用MaxCompute的云原生大数据计算资源和服务。本文将通过一系列最佳实践测评,探讨MaxFrame在分布式Pandas处理以及大语言模型数据处理场景中的表现,并分析其在实际工作中的应用潜力。
36 2
|
1月前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
182 45
|
1月前
|
Java 测试技术 持续交付
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
本文重点讲解如何搭建App自动化测试框架的思路,而非完整源码。主要内容包括实现目的、框架设计、环境依赖和框架的主要组成部分。适用于初学者,旨在帮助其快速掌握App自动化测试的基本技能。文中详细介绍了从需求分析到技术栈选择,再到具体模块的封装与实现,包括登录、截图、日志、测试报告和邮件服务等。同时提供了运行效果的展示,便于理解和实践。
112 4
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
|
23天前
|
敏捷开发 测试技术 持续交付
自动化测试之美:从零开始搭建你的Python测试框架
在软件开发的马拉松赛道上,自动化测试是那个能让你保持节奏、避免跌宕起伏的神奇小助手。本文将带你走进自动化测试的世界,用Python这把钥匙,解锁高效、可靠的测试框架之门。你将学会如何步步为营,构建属于自己的测试庇护所,让代码质量成为晨跑时清新的空气,而不是雾霾中的忧虑。让我们一起摆脱手动测试的繁琐枷锁,拥抱自动化带来的自由吧!
|
1月前
|
缓存 API 数据库
Python哪个框架合适开发速卖通商品详情api?
在跨境电商平台速卖通的商品详情数据获取与整合中,Python 语言及其多种框架(如 Flask、Django、Tornado 和 FastAPI)提供了高效解决方案。Flask 简洁灵活,适合快速开发;Django 功能全面,适用于大型项目;Tornado 性能卓越,擅长处理高并发;FastAPI 结合类型提示和异步编程,开发体验优秀。选择合适的框架需综合考虑项目规模、性能要求和团队技术栈。
27 2
|
1月前
|
数据可视化 开发者 Python
Python GUI开发:Tkinter与PyQt的实战应用与对比分析
【10月更文挑战第26天】本文介绍了Python中两种常用的GUI工具包——Tkinter和PyQt。Tkinter内置于Python标准库,适合初学者快速上手,提供基本的GUI组件和方法。PyQt基于Qt库,功能强大且灵活,适用于创建复杂的GUI应用程序。通过实战示例和对比分析,帮助开发者选择合适的工具包以满足项目需求。
131 7
|
1月前
|
数据采集 前端开发 中间件
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第26天】Python是一种强大的编程语言,在数据抓取和网络爬虫领域应用广泛。Scrapy作为高效灵活的爬虫框架,为开发者提供了强大的工具集。本文通过实战案例,详细解析Scrapy框架的应用与技巧,并附上示例代码。文章介绍了Scrapy的基本概念、创建项目、编写简单爬虫、高级特性和技巧等内容。
90 4