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

相关文章

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

Java MQTT实战应用

《JavaMQTT实战应用》本文详解MQTT协议,涵盖其发布/订阅机制、低功耗高效特性、三种服务质量等级(QoS0/1/2),以及客户端、代理、主题的核心概念,最后提供Linux部署教程、Sprin... 目录一、MQTT协议二、MQTT优点三、三种服务质量等级四、客户端、代理、主题1. 客户端(Clien

python删除xml中的w:ascii属性的步骤

《python删除xml中的w:ascii属性的步骤》使用xml.etree.ElementTree删除WordXML中w:ascii属性,需注册命名空间并定位rFonts元素,通过del操作删除属... 可以使用python的XML.etree.ElementTree模块通过以下步骤删除XML中的w:as

在Spring Boot中集成RabbitMQ的实战记录

《在SpringBoot中集成RabbitMQ的实战记录》本文介绍SpringBoot集成RabbitMQ的步骤,涵盖配置连接、消息发送与接收,并对比两种定义Exchange与队列的方式:手动声明(... 目录前言准备工作1. 安装 RabbitMQ2. 消息发送者(Producer)配置1. 创建 Spr

深度解析Spring Boot拦截器Interceptor与过滤器Filter的区别与实战指南

《深度解析SpringBoot拦截器Interceptor与过滤器Filter的区别与实战指南》本文深度解析SpringBoot中拦截器与过滤器的区别,涵盖执行顺序、依赖关系、异常处理等核心差异,并... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现

深度解析Spring AOP @Aspect 原理、实战与最佳实践教程

《深度解析SpringAOP@Aspect原理、实战与最佳实践教程》文章系统讲解了SpringAOP核心概念、实现方式及原理,涵盖横切关注点分离、代理机制(JDK/CGLIB)、切入点类型、性能... 目录1. @ASPect 核心概念1.1 AOP 编程范式1.2 @Aspect 关键特性2. 完整代码实

XML重复查询一条Sql语句的解决方法

《XML重复查询一条Sql语句的解决方法》文章分析了XML重复查询与日志失效问题,指出因DTO缺少@Data注解导致日志无法格式化、空指针风险及参数穿透,进而引发性能灾难,解决方案为在Controll... 目录一、核心问题:从SQL重复执行到日志失效二、根因剖析:DTO断裂引发的级联故障三、解决方案:修复

MySQL中的索引结构和分类实战案例详解

《MySQL中的索引结构和分类实战案例详解》本文详解MySQL索引结构与分类,涵盖B树、B+树、哈希及全文索引,分析其原理与优劣势,并结合实战案例探讨创建、管理及优化技巧,助力提升查询性能,感兴趣的朋... 目录一、索引概述1.1 索引的定义与作用1.2 索引的基本原理二、索引结构详解2.1 B树索引2.2

从入门到精通MySQL 数据库索引(实战案例)

《从入门到精通MySQL数据库索引(实战案例)》索引是数据库的目录,提升查询速度,主要类型包括BTree、Hash、全文、空间索引,需根据场景选择,建议用于高频查询、关联字段、排序等,避免重复率高或... 目录一、索引是什么?能干嘛?核心作用:二、索引的 4 种主要类型(附通俗例子)1. BTree 索引(

Java Web实现类似Excel表格锁定功能实战教程

《JavaWeb实现类似Excel表格锁定功能实战教程》本文将详细介绍通过创建特定div元素并利用CSS布局和JavaScript事件监听来实现类似Excel的锁定行和列效果的方法,感兴趣的朋友跟随... 目录1. 模拟Excel表格锁定功能2. 创建3个div元素实现表格锁定2.1 div元素布局设计2.