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

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

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

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亚丁号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值