基于WxPython的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程序启动及配置的初始化。具体代码如下:
import wx
from main.base.BaseConfig import BaseConfig
from main.controller.MainController import MainController if __name__ == '__main__':
BaseConfig().__init_sys_config__() #初始化系统配置 主要是sqlite数据库
app = wx.App(False)
controller = MainController()
app.MainLoop()
pass
View层:WxPython主要的代码。负责GUI的展示。MainView.py是项目的首页。首页包含日志菜单、日志显示区域、版权信息等。目前菜单还未进行权限的代码编写。下图是MainView.py的截图。
有个菜单核心方法initializeMenu(),新增的菜单都在这里体现,WxPython的菜单写法和JavaSwing的菜单写法非常类似。就连WxPython的部局和JavaSwing都非常类似。如果会JavaSwing学习WxPython基本无障碍。贴点代码给各位看看。
def initializeMenu(self):
self.menu_bar = wx.MenuBar() # 创建软件的菜单wx是三方控件默认在Frame类中存在MenuBar为页面的主菜单
# region 系统配置10
sysmenu = wx.Menu() # 创建子菜单 软件菜单下的子菜单可以有多个和JavaSwing比较类似
systemConfig = wx.MenuItem(sysmenu, wx.ID_SYSTEM_MENU, "系统配置") # 生成一个菜单项
systemConfig_png_path = Tools.get_resourcepath("resource") + os.sep + 'png' + os.sep + "cog.png"
systemConfig.SetBitmap(wx.Bitmap(systemConfig_png_path))
sysmenu.Append(systemConfig) systemLog = wx.MenuItem(sysmenu, 1001, "系统日志")
systemLog.SetBitmap(wx.Bitmap(Tools.get_resource_png_path() + os.sep + "clock_red.png"))
sysmenu.Append(systemLog) systemLogin = wx.MenuItem(sysmenu, 1002, "系统登录") # 生成一个系统登录的菜单项
systemLogin.SetBitmap(wx.Bitmap(Tools.get_resource_png_path() + os.sep + "user.png"))
sysmenu.Append(systemLogin) baidu_api_config = wx.MenuItem(sysmenu, 1003, "邮箱配置") # 生成一个系统登录的菜单项
baidu_api_config.SetBitmap(wx.Bitmap(Tools.get_resource_png_path() + os.sep + "email.png"))
sysmenu.Append(baidu_api_config) baidu_api_config = wx.MenuItem(sysmenu, 1004, "百度API配置") # 生成一个系统登录的菜单项
baidu_api_config.SetBitmap(wx.Bitmap(Tools.get_resource_png_path() + os.sep + "baidu.png"))
sysmenu.Append(baidu_api_config) systemClose = wx.MenuItem(sysmenu, wx.ID_EXIT, "关闭系统", "&Quit\tCtrl+Q") # 生成一个关闭系统的菜单项
systemClose.SetBitmap(wx.Bitmap(Tools.get_resource_png_path() + os.sep + "cancel.png"))
sysmenu.Append(systemClose) # menuBar.Append(sysmenu, "系统设置")
# endregion # region 帮助9
helpMenu = wx.Menu()
aboutMe = wx.MenuItem(helpMenu, wx.ID_ABOUT, "关于我们") # 生成一个关于我们的菜单项
aboutMe.SetBitmap(wx.Bitmap(Tools.get_resource_png_path() + os.sep + "contrast.png"))
helpMenu.Append(aboutMe) contracttUs = wx.MenuItem(helpMenu, 901, "联系我们") # 生成一个联系我们的菜单项
contracttUs.SetBitmap(wx.Bitmap(Tools.get_resource_png_path() + os.sep + "email.png"))
helpMenu.Append(contracttUs) opinionMenuItem = wx.MenuItem(helpMenu, 902, "意见反馈") # 生成一个意见反馈的菜单项
opinionMenuItem.SetBitmap(wx.Bitmap(Tools.get_resource_png_path() + os.sep + "bug.png"))
helpMenu.Append(opinionMenuItem) version_update = wx.MenuItem(helpMenu, 903, "版本检查")
version_update.SetBitmap(wx.Bitmap(Tools.get_resource_png_path() + os.sep + "update.png"))
helpMenu.Append(version_update)
# menuBar.Append(helpMenu, "帮助")
# endregion 帮助 self.menu_bar.Append(sysmenu, "系统设置")
self.menu_bar.Append(helpMenu, "帮助")
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层:整个项目基础类存放地点。包含
- BaseConfig.py系统配置类,主要是路径配置,兼容mac和win。系统第一次安装的时候会把系统数据库(sqlite3)初始化到指定的目录。具体代码:
import os
import getpass from main.plugin.Tools import Tools class BaseConfig:
# region 窗体变量
INT_LOG_FILE_PATH = ""
LOG_FILE_NAME = "toolkit-frame.log"
LOG_FILE_PATH = "/Users/zhangyu/LandSea/"
SOFT_VERSION = "AiToolkit"
FILE_NAME = "toolkit.sqlite" # endregion # region 构造函数
def __init__(self):
resource_db = Tools.get_resourcepath("resource") + os.sep + "db" + os.sep + self.FILE_NAME if Tools.get_os_name() == "WIN":
self.IS_LUX_OS = False
self.IS_MAC_OS = False
self.IS_WIN_OS = True
self.CORPUS_ROOT = 'D:\\Landsea\\Train\\Corpus' # 语料库根路径
self.ROOT_PATH = "C:\\Users\\" + getpass.getuser() + "\\AppData\\Local\\" + self.SOFT_VERSION + "\\"
self.TEMP_PATH = "C:\\Users\\" + getpass.getuser() + "\\AppData\\Local\\" + self.SOFT_VERSION + "\\Temp\\"
elif Tools.get_os_name() == "OS":
self.IS_LUX_OS = False
self.IS_MAC_OS = True
self.IS_WIN_OS = False
self.CORPUS_ROOT = '/Users/zhangyu/Corpus'
self.ROOT_PATH = "/Users/" + getpass.getuser() + "/AppData/Local/" + self.SOFT_VERSION + "/"
self.TEMP_PATH = "/Users/" + getpass.getuser() + "/AppData/Local/" + self.SOFT_VERSION + "/Temp/"
elif Tools.get_os_name() == "LUX":
self.IS_LUX_OS = True
self.IS_MAC_OS = False
self.IS_WIN_OS = False
self.CORPUS_ROOT = '/Users/zhangyu/Corpus'
self.ROOT_PATH = "/Users/" + getpass.getuser() + "/AppData/Local/" + self.SOFT_VERSION + "/"
self.TEMP_PATH = "/Users/" + getpass.getuser() + "/AppData/Local/" + self.SOFT_VERSION + "/Temp/"
else:
self.IS_LUX_OS = False
self.IS_MAC_OS = False
self.IS_WIN_OS = False
pass
Tools.judge_diskpath_exits_create(self.ROOT_PATH)
Tools.judge_diskpath_exits_create(self.TEMP_PATH)
GLOBAL_CONFIG_PATH_NAME = self.ROOT_PATH + self.FILE_NAME
if os.path.exists(GLOBAL_CONFIG_PATH_NAME):
pass
else:
Tools.copy_file_to_disk(resource_db, GLOBAL_CONFIG_PATH_NAME)
if Tools.judge_is_exits_network():
self.EXITS_NET = True
else:
self.EXITS_NET = False # endregion # region 初始化系统配置文件 zhangyu-2019-5-25
def __init_sys_config__(self):
resource_db = Tools.get_resourcepath("resource") + os.sep + "db" + os.sep + self.FILE_NAME
if Tools.get_os_name() == "WIN":
self.IS_WIN_OS = True
GLOBAL_CONFIG_PATH_NAME = self.ROOT_PATH + self.FILE_NAME
Tools.judge_diskpath_exits_create(self.ROOT_PATH)
Tools.judge_diskpath_exits_create(self.TEMP_PATH)
if os.path.exists(GLOBAL_CONFIG_PATH_NAME):
return
else:
Tools.copy_file_to_disk(resource_db, GLOBAL_CONFIG_PATH_NAME)
return
pass
elif Tools.get_os_name() == "OS":
self.IS_MAC_OS = True
GLOBAL_CONFIG_PATH_NAME = self.ROOT_PATH + self.FILE_NAME
Tools.judge_diskpath_exits_create(self.ROOT_PATH)
Tools.judge_diskpath_exits_create(self.TEMP_PATH) if os.path.exists(GLOBAL_CONFIG_PATH_NAME):
return
else:
Tools.copy_file_to_disk(resource_db, GLOBAL_CONFIG_PATH_NAME)
return
elif Tools.get_os_name() == "LUX":
self.IS_LUX_OS = True
Tools.judge_diskpath_exits_create(self.ROOT_PATH)
Tools.judge_diskpath_exits_create(self.TEMP_PATH)
pass
pass
# endregion
BaseController.py Controller的基类。集成了系统配置类(BaseConfig.py),同时读取系统参数。
BaseEntity.py
BaseFrame.py
MySqlAccess.py
SqliteAccess.py
access层:整个项目数据访问类存放地点。主要是controller访问。
最后介绍requirements.txt文件。这里面是我使用的所有包。各位根据需要自己增加需要的包,
基于WxPython的GUI框架toolkit-frame介绍的更多相关文章
- 基于MVC4+EasyUI的Web开发框架形成之旅--框架总体界面介绍
在前面介绍了一些关于最新基于MVC4+EasyUI的Web开发框架文章,虽然Web开发框架的相关技术文章会随着技术的探讨一直写下去,不过这个系列的文章,到这里做一个总结,展示一下整体基于MVC4+Ea ...
- 基于.NET CORE微服务框架 -surging的介绍和简单示例 (开源)
一.前言 至今为止编程开发已经11个年头,从 VB6.0,ASP时代到ASP.NET再到MVC, 从中见证了.NET技术发展,从无畏无知的懵懂少年,到现在的中年大叔,从中的酸甜苦辣也只有本人自知.随着 ...
- NET Core微服务之路:自己动手实现Rpc服务框架,基于DotEasy.Rpc服务框架的介绍和集成
本篇内容属于非实用性(拿来即用)介绍,如对框架设计没兴趣的朋友,请略过. 快一个月没有写博文了,最近忙着两件事; 一:阅读刘墉先生的<说话的魅力>,以一种微妙的,你我大家都会经常遇见 ...
- Rookey.Frame v1.0 视频教程之三发布-框架核心思想介绍
本期发布视频: (三)Rookey.Frame v1.0框架核心思想 介绍了Rookey.Frame v1.0框架搭建的核心思想,将框架核心思想理解清楚,对框架运行就会得心应手 官方视频教程: htt ...
- 封装:简要介绍自定义开发基于WPF的MVC框架
原文:封装:简要介绍自定义开发基于WPF的MVC框架 一.目的:在使用Asp.net Core时,深感MVC框架作为页面跳转数据处理的方便,但WPF中似乎没有现成的MVC框架,由此自定义开发一套MVC ...
- Visual-platform,基于Vue的可视化大屏开发GUI框架
visual-platform 基于Vue的可视化大屏开发GUI框架 ------ CreatedBy 漆黑小T 构建用于开发可视化大屏项目的自适应布局的GUI框架. github仓库: https: ...
- JAVA之旅(三十一)——JAVA的图形化界面,GUI布局,Frame,GUI事件监听机制,Action事件,鼠标事件
JAVA之旅(三十一)--JAVA的图形化界面,GUI布局,Frame,GUI事件监听机制,Action事件,鼠标事件 有段时间没有更新JAVA了,我们今天来说一下JAVA中的图形化界面,也就是GUI ...
- 基于NetMQ的TLS框架NetMQ.Security的实现分析
基于NetMQ的TLS框架NetMQ.Security的实现分析 前言 介绍 交互过程 支持的协议 TLS协议 支持的算法 实现 握手 第一次握手 Client Hello 第二次握手 Server ...
- JavaScript单元测试框架JsUnit基本介绍和使用
JavaScript单元测试框架JsUnit基本介绍和使用 XUnit framework XUnit是一套标准化的独立于语言的概念和结构集合,用于编写和运行单元测试(Unit tests). 每一个 ...
随机推荐
- Android编程权威指南第三版 第32章
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/qq_35564145/article/de ...
- Proto3:风格
本文介绍.proto文件的编码风格.遵循下面的惯例,可以使你的protocol buffer消息定义和它们对应的类连贯且已读. 注意,protocol buffer风格随时间变化一直在进步,所以可能你 ...
- 码海拾遗:strstr()、strcmp()和strcpy()实现
1.strstr()实现 原型:char * strstr(const char * str1, const char * str2) 说明:判断str2是否为str1的子串,如果是则返回str2第一 ...
- JavaScript逻辑分支switch 练习题
1.输入月份,显示当月的天数, 利用case穿透简化代码 var month = prompt("请输入月份"); var year = prompt("请输入年份&q ...
- spring jpa ManyToMany 理解和使用
1.java和jpa 中所有的关系都是单向的.这个关系数据库不同,关系数据库,通过外键定义并查询,使得反向查询总是存在的. 2.JPA还定义了一个OneToMany关系,它与ManyToMany关系类 ...
- RTMP协议推流交互流程
目录 RTMP协议推流交互流程 RTMP协议推流流程 RTMP握手 RTMP建立连接 RTMP建流&Play Wireshark抓个RTMP流 RTMP协议推流交互流程 想了解下直播常见协议R ...
- jquery-购物车js
购物车示例js,为了方便参考,页面写的比较简单.示例如下图所示: html代码如下: <!doctype html> <html lang="en"> &l ...
- 【Geek议题】当年那些风骚的跨域操作
前言 现在cross-origin resource sharing(跨域资源共享,下简称CORS)已经十分普及,算上IE8的不标准兼容(XDomainRequest),各大浏览器基本都已支持,当年为 ...
- python正则表达式之re模块方法介绍
python正则表达式之re模块其他方法 1:search(pattern,string,flags=0) 在一个字符串中查找匹配 2:findall(pattern,string,flags=0) ...
- 01 搭建EasyMock环境
EasyMock 介绍 EasyMock是一个构建模拟数据的平台,也可以说是一个在线mockJs平台 EasyMock优势 省去配置.安装mockJs步骤,解决多人协作Mock数据不互通问题 不需要在 ...