基于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). 每一个 ...
随机推荐
- python 有关堡垒机的那些事
堡垒机为了保证系统或服务器的安全性,防止运维和开发人员胡乱操作服务器,导致不必要的损失,使用堡垒机来完成对运维和开发人员的授权.用户统一登录堡垒机账号来操作系统或服务器.堡垒机等于成了生产系统的SSO ...
- linux vi命令详解及使用技巧
进入vi的命令vi filename :打开或新建文档,并将光标置于第一行首vi +n filename :打开文档,并将光标置于第n行首vi + filename :打开文档,并将光标置于最后一行首 ...
- Shopee招聘-测试开发leader(30k-60k/月)
内推邮箱:tim.zhao@shopee.com 地点:深圳 1.测试Leader (30k-60k/月) 岗位职责 负责根据项目计划制订测试计划和规划,保证项目质量和进度: 负责与产品经理和开发人员 ...
- Oops 的栈信息分析
MTK MT55 F3600 平台 现象:播放MP4文件不断快退或者快进系统重启. 关键log: Kernel panic - not syncing: x_msg_q_receive(): not ...
- 学了C++不知道怎么搞后台开发?先看看这份学习路线吧!
作者:AJ 在去年结束的秋季招聘中,后台开发或服务器开发的岗位需求一度火热,甚至超过了算法岗.不少同学从诸神黄昏的算法岗战场上退下,转向更偏向工程能力的后台开发岗,从而造成后台开发岗位竞争的大爆发. ...
- tfgan折腾笔记(二):核心函数详述——gan_model族
定义model的函数有: 1.gan_model 函数原型: def gan_model( # Lambdas defining models. generator_fn, discriminator ...
- 解决WebMvcConfigurer下的addViewControllers无法找到制定页面
解决WebMvcConfigurer下的addViewControllers无法找到制定页面 这种都已经配置了拦截跳转,但无效的原因是,没有加载thymeleaf依赖 <dependency&g ...
- CSS+DIV自适应布局
CSS+DIV自适应布局 1.两列布局(左右两侧,左侧固定宽度200px;右侧自适应占满) 代码如下: <!doctype html> <html> <head> ...
- var, let ,const区别
ES6中加入了let,const字符,先说说新的区别: 作用域:let 声明的变量只在它所在的代码块内有效,而且不存在变量提升,即变量可以在声明之前使用,值为undefined.let未声明变量前会报 ...
- 数据挖掘入门系列教程(三)之scikit-learn框架基本使用(以K近邻算法为例)
数据挖掘入门系列教程(三)之scikit-learn框架基本使用(以K近邻算法为例) 简介 scikit-learn 估计器 加载数据集 进行fit训练 设置参数 预处理 流水线 结尾 数据挖掘入门系 ...