tkinter-TinUI-xml实战(5)TinUIxml编辑器

2024-04-10 14:18

本文主要是介绍tkinter-TinUI-xml实战(5)TinUIxml编辑器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

tkinter-TinUI-xml实战(5)TinUIxml编辑器

  • 引言
  • 声明
  • 文件结构
  • 编写界面(main.xml)
  • 编写TinUIXml-IDO代码
  • 功能代码
    • 导入xml文本
    • 导出IDO代码
  • 完整代码
  • 效果
  • 结语

引言

TinUIXml推出有一段时间了,其中,最重要的部分无非就是以下两点:

  1. xml文件的调试

  2. IDO代码部分的编写

虽然相比于使用TinUI自身的布局系统,使用xml文件可以大大简化TinUI界面的调试编写,同时为程序的开发节约更多的时间。当然,我们还是需要通过每一次代码运行,来查看我们编写的xml文件是否符合我们自己的预期。

这不是说TinUI的原生布局没有用,TinUI的绝对布局有更大的灵活性,适合个别单体组件的布局使用。

另外,当界面复杂以后,IDO部分的代码也就随之复杂了。

综上,我们希望有一款既能够直接预览xml布局的界面,同时还能够为我们自动导出一定格式的IDO代码的TinUIXml编辑器。


声明

本项目属于作者原创。借鉴了GitHub/TinUI上的tuxml.py,翻版必究,但可以自行添加功能代码。

本项目使用的TinUI为我开源并维护在GitHub上的主文件——TinUI.py。当然,使用PYPI中下载安装的tinui也可以。


文件结构

在这里插入图片描述

  • main.xml - 主界面
  • tinui.py - TinUI界面核心支持
  • TinUIXml编辑器.py - 本次项目文件

编写界面(main.xml)

这次的界面虽然比之前复杂一点,但是我们还是可以做一下分析的。

  • 左侧分别为两个文本框

    • 左上角的文本框负责填写xml格式文本段

    • 左下角的文本框显示导出的IDO代码

  • 右上角显示两个按钮,分别为渲染TinUI界面、导出IDO代码

  • 右侧为预览的TinUI

依据以上分析,编写main.xml文件:

<!--TinUIXml编辑器-->
<tinui><line><line><textbox width='475' height='350' text='<!--TinUIXml UI界面布局-->' scrollbar='True'>xmltext</textbox></line><line><textbox width='475' height='350' text='#TinUIXml-IDO' scrollbar='True'>codetext</textbox></line><back></back><line x='510'><button text='xml导入' command='self.funcs["inxml"]'></button><button text='生成IDO代码' command='self.funcs["inido"]'></button></line></line>
</tinui>

编写TinUIXml-IDO代码

以下是通过本程序生成的IDO代码,但是IDO代码经过了一定更改,这也是本程序不可改变的后续人工步骤。

u=BasicTinUI(root)
u.pack(fill='both',expand=True)
x=TinUIXml(u)
#in
x.funcs['inxml']=inxml
x.funcs['inido']=inido
#during
with open('main.xml',mode='r',encoding='utf-8') as f:xml=f.read()
x.loadxml(xml)
#out
xmltext=x.tags['xmltext'][0]
xmltext.insert('end','\n')
codetext=x.tags['codetext'][0]
codetext.insert('end','\n# u=TinUI(root) ; x=TinUIXml(u) ; xml=file.read()\n')

功能代码

导入xml文本

def inxml(event):uixml=xmltext.get(1.0,'end')xui.funcs=dict()xui.datas=dict()xui.tags=dict()result=re.findall("self\.(.*?)\[.(.*?).\]'",uixml,re.M|re.S)for i in result:if i[0]=='funcs':xui.funcs[i[1]]=Noneelif i[0]=='datas':xui.datas[i[1]]=(None,None)xui.yendy=5xui.clean()xui.loadxml(uixml)return result

导出IDO代码

def inido(event):r=inxml(None)write('#in')for i in r:if i[0]=='funcs':write(f'x.funcs["{i[1]}"] = {i[1]}')elif i[0]=='datas':write(f'x.datas["{i[1]}"] = {i[1]}')write('#during')write('x.loadxml(xml)')write('#out')for tag in xui.tags.keys():write(f'{tag} = x.data["{tag}"]')

完整代码

这个编辑器只是雏形,但我不会再改进,请各自根据所需以此为参考添加功能。

from tinui import *
from tkinter import Tk
import redef write(text):codetext.insert('end',text+'\n')def inxml(event):uixml=xmltext.get(1.0,'end')xui.funcs=dict()xui.datas=dict()xui.tags=dict()result=re.findall("self\.(.*?)\[.(.*?).\]'",uixml,re.M|re.S)for i in result:if i[0]=='funcs':xui.funcs[i[1]]=Noneelif i[0]=='datas':xui.datas[i[1]]=(None,None)xui.yendy=5xui.clean()xui.loadxml(uixml)return resultdef inido(event):r=inxml(None)write('#in')for i in r:if i[0]=='funcs':write(f'x.funcs["{i[1]}"] = {i[1]}')elif i[0]=='datas':write(f'x.datas["{i[1]}"] = {i[1]}')write('#during')write('x.loadxml(xml)')write('#out')for tag in xui.tags.keys():write(f'{tag} = x.data["{tag}"]')root=Tk()
root.geometry('1280x720+5+5')
root.title('TinUIXml设计测试')u=BasicTinUI(root)
u.pack(fill='both',expand=True)
x=TinUIXml(u)
#in
x.funcs['inxml']=inxml
x.funcs['inido']=inido
#during
with open('main.xml',mode='r',encoding='utf-8') as f:xml=f.read()
x.loadxml(xml)
#out
xmltext=x.tags['xmltext'][0]
xmltext.insert('end','\n')
codetext=x.tags['codetext'][0]
codetext.insert('end','\n# u=TinUI(root) ; x=TinUIXml(u) ; xml=file.read()\n')ui=TinUI(u,width=730,height=650)
ui.place(x=520,y=40)
xui=TinUIXml(ui)root.mainloop()

效果

在这里插入图片描述

我到现在还在感谢自己为TinUI提供了滚动条的绘制代码,否则TinUI不会有自身的textbox控件,也不会有之后的视野可变类控件。


结语

拥有了半自动化的TinUIXml编辑器,TinUI的界面布局变得更加方便了。

将开源TinUI添加到自己的项目时要注意,TinUI使用了GPL开源协议,使用TinUI需要遵照协议内容和使用条款。

🔆tkinter创新🔆

这篇关于tkinter-TinUI-xml实战(5)TinUIxml编辑器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/891292

相关文章

浅析如何使用xstream实现javaBean与xml互转

《浅析如何使用xstream实现javaBean与xml互转》XStream是一个用于将Java对象与XML之间进行转换的库,它非常简单易用,下面将详细介绍如何使用XStream实现JavaBean与... 目录1. 引入依赖2. 定义 JavaBean3. JavaBean 转 XML4. XML 转 J

SpringBoot中四种AOP实战应用场景及代码实现

《SpringBoot中四种AOP实战应用场景及代码实现》面向切面编程(AOP)是Spring框架的核心功能之一,它通过预编译和运行期动态代理实现程序功能的统一维护,在SpringBoot应用中,AO... 目录引言场景一:日志记录与性能监控业务需求实现方案使用示例扩展:MDC实现请求跟踪场景二:权限控制与

Python利用ElementTree实现快速解析XML文件

《Python利用ElementTree实现快速解析XML文件》ElementTree是Python标准库的一部分,而且是Python标准库中用于解析和操作XML数据的模块,下面小编就来和大家详细讲讲... 目录一、XML文件解析到底有多重要二、ElementTree快速入门1. 加载XML的两种方式2.

Spring 基于XML配置 bean管理 Bean-IOC的方法

《Spring基于XML配置bean管理Bean-IOC的方法》:本文主要介绍Spring基于XML配置bean管理Bean-IOC的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录一. spring学习的核心内容二. 基于 XML 配置 bean1. 通过类型来获取 bean2. 通过

Python列表去重的4种核心方法与实战指南详解

《Python列表去重的4种核心方法与实战指南详解》在Python开发中,处理列表数据时经常需要去除重复元素,本文将详细介绍4种最实用的列表去重方法,有需要的小伙伴可以根据自己的需要进行选择... 目录方法1:集合(set)去重法(最快速)方法2:顺序遍历法(保持顺序)方法3:副本删除法(原地修改)方法4:

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t

使用Python将JSON,XML和YAML数据写入Excel文件

《使用Python将JSON,XML和YAML数据写入Excel文件》JSON、XML和YAML作为主流结构化数据格式,因其层次化表达能力和跨平台兼容性,已成为系统间数据交换的通用载体,本文将介绍如何... 目录如何使用python写入数据到Excel工作表用Python导入jsON数据到Excel工作表用

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis