基于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). 每一个 ...
随机推荐
- ActiveMQ学习总结(一)
自己写的网上商城项目中使用了ActiveMQ,虽然相比于RabbitMQ,kafka,RocketMQ等相比,ActiveMQ可能性能方面不是最好的选择,不过消息队列其实原理区别不大,这里对学过的关于 ...
- 大忙人的jdk8,比出生晚了好几个激情的夏天
写给大忙人的jdk8到手了,第一件事情就蒙蔽了,mac装的jdk7,切换jdk的功能要整出来才行,下好jdk8up101安装,假装几行代码搞定目标在命令行下,可以通过命令'jdk6', 'jdk7', ...
- Docker实战之MySQL主从复制
前言 曾几何时,看着高大上的架构和各位前辈高超的炫技,有没有怦然心动,也想一窥究竟?每当面试的时候,拿着单应用的架构,吹着分库分表的牛X,有没有心里慌的一批? 其实很多时候,我们所缺少的只是对高大上的 ...
- CSS——NO.3(CSS选择器)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- C++走向远洋——38(用对象数组操作长方柱类)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:changfangzhu.cpp * 作者:常轩 * 微信公众号 ...
- IT从业者疫情之下出路何在
作为一个IT行业十年经历的从业人员,在北京大公司工作过,但因衡量着北京大都市的繁华下高消费和高房价,选择到二线城市发展和组建家庭,由此逃离北上广,结束了数年的北漂生涯.很荣幸到了二线城市顺利遇见属于自 ...
- 什么是HDFS?算了,告诉你也不懂。
前言 只有光头才能变强. 文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y 上一篇已经讲解了「大数据入门」的相关基础概念和知 ...
- maven包引入问题ClassNotFoundException: org.elasticsearch.client.Cancellable
业务需要,做搜索功能,在springboot聚合项目下,新建了es模块module 但是在引入elasticsearch依赖的时候,出现了问题 引入相应依赖后 <dependency> & ...
- Markdown 语法简要规则
Markdown简介 Markdown 是一种轻量级的「标记语言」,它的优点很多,目前也被越来越多的写作爱好者,撰稿者广泛使用.看到这里请不要被「标记」.「语言」所迷惑,Markdown 的语法十分简 ...
- Windows安装python包出现PermissionError: [WinError 32] 另一个程序正在使用此文件,进程无法访问的问题解决方案
在python中安装sqlalchemy时,总是提示(当安装依赖有vs的python包时,可能会出现以下错误:) PermissionError: [WinError 32] 另一个程序正在使用此文件 ...