源码下载地址: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层:整个项目基础类存放地点。包含

  1. 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介绍的更多相关文章

  1. 基于MVC4+EasyUI的Web开发框架形成之旅--框架总体界面介绍

    在前面介绍了一些关于最新基于MVC4+EasyUI的Web开发框架文章,虽然Web开发框架的相关技术文章会随着技术的探讨一直写下去,不过这个系列的文章,到这里做一个总结,展示一下整体基于MVC4+Ea ...

  2. 基于.NET CORE微服务框架 -surging的介绍和简单示例 (开源)

    一.前言 至今为止编程开发已经11个年头,从 VB6.0,ASP时代到ASP.NET再到MVC, 从中见证了.NET技术发展,从无畏无知的懵懂少年,到现在的中年大叔,从中的酸甜苦辣也只有本人自知.随着 ...

  3. NET Core微服务之路:自己动手实现Rpc服务框架,基于DotEasy.Rpc服务框架的介绍和集成

    本篇内容属于非实用性(拿来即用)介绍,如对框架设计没兴趣的朋友,请略过. 快一个月没有写博文了,最近忙着两件事;    一:阅读刘墉先生的<说话的魅力>,以一种微妙的,你我大家都会经常遇见 ...

  4. Rookey.Frame v1.0 视频教程之三发布-框架核心思想介绍

    本期发布视频: (三)Rookey.Frame v1.0框架核心思想 介绍了Rookey.Frame v1.0框架搭建的核心思想,将框架核心思想理解清楚,对框架运行就会得心应手 官方视频教程: htt ...

  5. 封装:简要介绍自定义开发基于WPF的MVC框架

    原文:封装:简要介绍自定义开发基于WPF的MVC框架 一.目的:在使用Asp.net Core时,深感MVC框架作为页面跳转数据处理的方便,但WPF中似乎没有现成的MVC框架,由此自定义开发一套MVC ...

  6. Visual-platform,基于Vue的可视化大屏开发GUI框架

    visual-platform 基于Vue的可视化大屏开发GUI框架 ------ CreatedBy 漆黑小T 构建用于开发可视化大屏项目的自适应布局的GUI框架. github仓库: https: ...

  7. JAVA之旅(三十一)——JAVA的图形化界面,GUI布局,Frame,GUI事件监听机制,Action事件,鼠标事件

    JAVA之旅(三十一)--JAVA的图形化界面,GUI布局,Frame,GUI事件监听机制,Action事件,鼠标事件 有段时间没有更新JAVA了,我们今天来说一下JAVA中的图形化界面,也就是GUI ...

  8. 基于NetMQ的TLS框架NetMQ.Security的实现分析

    基于NetMQ的TLS框架NetMQ.Security的实现分析 前言 介绍 交互过程 支持的协议 TLS协议 支持的算法 实现 握手 第一次握手 Client Hello 第二次握手 Server ...

  9. JavaScript单元测试框架JsUnit基本介绍和使用

    JavaScript单元测试框架JsUnit基本介绍和使用 XUnit framework XUnit是一套标准化的独立于语言的概念和结构集合,用于编写和运行单元测试(Unit tests). 每一个 ...

随机推荐

  1. python 有关堡垒机的那些事

    堡垒机为了保证系统或服务器的安全性,防止运维和开发人员胡乱操作服务器,导致不必要的损失,使用堡垒机来完成对运维和开发人员的授权.用户统一登录堡垒机账号来操作系统或服务器.堡垒机等于成了生产系统的SSO ...

  2. linux vi命令详解及使用技巧

    进入vi的命令vi filename :打开或新建文档,并将光标置于第一行首vi +n filename :打开文档,并将光标置于第n行首vi + filename :打开文档,并将光标置于最后一行首 ...

  3. Shopee招聘-测试开发leader(30k-60k/月)

    内推邮箱:tim.zhao@shopee.com 地点:深圳 1.测试Leader (30k-60k/月) 岗位职责 负责根据项目计划制订测试计划和规划,保证项目质量和进度: 负责与产品经理和开发人员 ...

  4. Oops 的栈信息分析

    MTK MT55 F3600 平台 现象:播放MP4文件不断快退或者快进系统重启. 关键log: Kernel panic - not syncing: x_msg_q_receive(): not ...

  5. 学了C++不知道怎么搞后台开发?先看看这份学习路线吧!

    作者:AJ 在去年结束的秋季招聘中,后台开发或服务器开发的岗位需求一度火热,甚至超过了算法岗.不少同学从诸神黄昏的算法岗战场上退下,转向更偏向工程能力的后台开发岗,从而造成后台开发岗位竞争的大爆发. ...

  6. tfgan折腾笔记(二):核心函数详述——gan_model族

    定义model的函数有: 1.gan_model 函数原型: def gan_model( # Lambdas defining models. generator_fn, discriminator ...

  7. 解决WebMvcConfigurer下的addViewControllers无法找到制定页面

    解决WebMvcConfigurer下的addViewControllers无法找到制定页面 这种都已经配置了拦截跳转,但无效的原因是,没有加载thymeleaf依赖 <dependency&g ...

  8. CSS+DIV自适应布局

    CSS+DIV自适应布局 1.两列布局(左右两侧,左侧固定宽度200px;右侧自适应占满) 代码如下: <!doctype html> <html> <head> ...

  9. var, let ,const区别

    ES6中加入了let,const字符,先说说新的区别: 作用域:let 声明的变量只在它所在的代码块内有效,而且不存在变量提升,即变量可以在声明之前使用,值为undefined.let未声明变量前会报 ...

  10. 数据挖掘入门系列教程(三)之scikit-learn框架基本使用(以K近邻算法为例)

    数据挖掘入门系列教程(三)之scikit-learn框架基本使用(以K近邻算法为例) 简介 scikit-learn 估计器 加载数据集 进行fit训练 设置参数 预处理 流水线 结尾 数据挖掘入门系 ...