# xmlui
**Repository Path**: zhangdianwei/xmlui
## Basic Information
- **Project Name**: xmlui
- **Description**: 基于wxPython和tkinter,用xml描述ui结构,辅助python界面开发的库。
- **Primary Language**: Python
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 4
- **Forks**: 1
- **Created**: 2021-01-01
- **Last Updated**: 2024-11-27
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# xmlui
* 使用wxPython开发ui的时候,可以手写ui界面,也可以使用wxFormBuilder。但是:
* 手写ui界面代码太多,并且写起来很麻烦
* 使用wxFormBuilder等可视化工具,需要维护额外的工程文件。
* 这个项目借鉴了html的书写方式,用**易手写**的xml描述ui结构,在.py文件中处理业务逻辑。
* 环境依赖
* python==2.x
* wxPython==4.1.0
# 安装
```
pip install xmlui
```
# 使用
## 1.使用xml描述UI结构
* wx_simple.xml
```xml
```
## 2.编写代码,显示界面
```python
import xmlui
import wx
class MainController(xmlui.Controller):
def __init__(self):
pass
def after_load(self):
pass
def OnClickButton(self, evt):
wx.MessageBox(self.ui_mybtn.GetLabel())
def main():
app = xmlui.load_wx("wx_simple.xml", [MainController])
app.MainLoop()
if __name__ == '__main__':
main()
```
# 原理
* xml中的每个tag标签都可以创建一类对象
1. 普通的wx对象,例如本例中的wx.App,wx.Frame,wx.Button等,及其他wx命名空间下的继承于wx.Window的对象。
2. 直接调用父节点的函数,例如`wx.Colour(0,0,0)`
3. 绑定事件(见下面的例子):`OnClickButton`
4. 创建布局器,只支持BoxSizer(见下面的例子)
5. 创建菜单,支持应用程序菜单和右键菜单两种,使用方式见sample/wx_menu.py。
* 可以在代码中定义一个控制类,并在xml中使用。本例中为`MainController`,这个类有下面的成员:
* `xmlui.Controller.node`:对应的xml中的节点,这个例子里是wx.App的实例。
* `after_load`:整个节点加载完的回调函数
* controller属性可以加在xml中的任意节点上,并支持嵌套。
* 更复杂的例子可以参考sample目录下的内容
# xml所支持的配置内容
## 直接拼普通的界面
例如wx.Frame,wx.Button,wx.StaticText,wx.TextEntry等,都可以使用这样的配置方式
```xml
```
其中支持以下可选参数:
* id:窗口id
* title:窗口标题,关键字也可以为label
* pos:窗口位置
* size:窗口大小
* style:窗口的风格
**注意**:这些参数会被传递到wx.Window的构造函数中,如果参数不正确,会导致wx内部抛出异常。例如给wx.Button传递title参数是不可以的,只能传递label参数。
## 支持BoxSizer布局
举例如下:
```xml
```
BoxSizer支持以下可选参数:
* orient:布局方向。"v"代表垂直,"h"代表水平。默认为"h"
* proportion:每个面板的拉伸比例
* flags:每个面板的额外标志
## 默认支持BoxSizer布局
```xml
```
1. Frame具有BoxSizer布局,并且布局方向为垂直方向。有三个Panel子节点
2. panelA和panelC在垂直方向上不拉伸,panelB在垂直方向上填满剩余空间
---
1. sizer_orient:设置布局方向。设置在容器节点上。可选值:"v"垂直布局,"h"水平布局。默认是水平布局
2. sizer_proportion:设置在布局方向上的拉伸百分比。默认是0,不拉伸。
3. sizer_flags:其他BoxSizer支持的布局参数。默认没有任何参数。
---
sample目录中有两个布局例子:
1. wx_boxsizer.py
2. wx_defaultlayout.py
都是使用BoxSizer进行布局的例子。
## 绑定事件
只有继承于wx.Window的类,才能绑定事件
```xml
```
有些事件有onxxx简写形式,包括
* wx.Button的点击事件: `