tkinter-TinUI-xml實戰(11)多功能TinUIxml編輯器

引言

在TinUIXml簡易編輯器中,我們通過TinUI搭建了一個簡易的針對TinUIXml布局的編輯器,基本掌握了TinUIXml布局和TinUIXml的導入與導出。現在,就在此基礎上,對編輯器進行升級。

本次升級的功能:

  1. 更合理的xml編輯與UI展示布局,python代碼導出放到另一個子窗口
  2. python代碼使用語法高亮顯示
  3. 在UI展示中,允許打開鼠標十字線坐標定位
  4. 允許右鍵單擊創建標記坐標點,并能夠通過坐標點管理窗口來操作坐標點

新版TinUIXml簡易編輯器內置到了TinUI包中,/test/tuxmltest.py,xml資源文件在/test/xmltestpage目錄下。

重新布局

新的主界面main.xml

<tinui>
<line anchor='w' y='20'><button2 text='導入xml' command='self.funcs["inxml"]'></button2><button2 text='python代碼' command='self.funcs["pycode"]'></button2><checkbutton text='啟用十字線定位' command='self.funcs["if_location"]'></checkbutton><paragraph text='x: y:'>loctext</paragraph>
</line>
<line><ui width='870' height='630' scrollbar='True'>xmlui</ui>
</line>
<line x='710' y='20' anchor='w'><button2 text='打開標記點管理窗口' command='self.funcs["open_markw"]'></button2>
</line>
</tinui>

生成界面:
在這里插入圖片描述

在新版TinUIXml編輯器中,默認添加了一段來自于TinUI.test.maintest里的back介紹界面xml,這樣就可以一目了然明確文本框的交互意義,點擊“導入xml”后如圖:
在這里插入圖片描述

新python代碼窗口

在新版TinUIXml簡易編輯器中,python代碼部分被劃歸到了新的子窗口,名為pycodew,資源文件為pytest.xml

<!--彈窗顯示python代碼(IDO)部分-->
<tinui>
<line><textbox width='500' height='500' scrollbar='True'>textbox</textbox>
</line>
<line anchor='w' y='530'><button text='復制' command='self.funcs["copy_pycode"]'></button><button text='標注重點' command='self.funcs["highlight"]'></button><label text='※該內容不可更改'></label>
</line>
</tinui>

tuxmltest.py中,創建新的窗口:

import idlelib.colorizer as idc
import idlelib.percolator as idp#...#彈窗窗口
pycodew=Toplevel()
pycodew.title("Python代碼")
# 設置窗口大小
window_width = 520
window_height = 550
# 獲取屏幕大小
screen_width = pycodew.winfo_screenwidth()
screen_height = pycodew.winfo_screenheight()
# 計算窗口居中的x和y坐標
x_coordinate = int((screen_width/2) - (window_width/2))
y_coordinate = int((screen_height/2) - (window_height/2))
# 設置窗口的位置和大小,并禁止改變尺寸
pycodew.geometry("{}x{}+{}+{}".format(window_width, window_height,x_coordinate, y_coordinate))
pycodew.resizable(width=False, height=False)  # 禁止改變窗口大小
pctinui=BasicTinUI(pycodew)
pctinui.pack(fill='both',expand=True)
pycodew.protocol("WM_DELETE_WINDOW", lambda: pycodew.withdraw())  # 忽略關閉窗口的協議
pycodew.withdraw()
pctinuix=TinUIXml(pctinui)xmlf=open(os.path.dirname(__file__)+r'\xmltestpage\pytest.xml','r',encoding='utf-8')
xml=xmlf.read()
xmlf.close()
pctinuix.environment(globals())
pctinuix.loadxml(xml)
textbox=pctinuix.tags['textbox'][0]
idc.color_config(textbox)
p = idp.Percolator(textbox)
d = idc.ColorDelegator()
p.insertfilter(d)

注意到其中的idc, idp等,都是從idlelib中導入的,用來對文本框進行python語法高亮處理。

新xml編輯器對于python代碼的處理,與上一版一樣,都是重新生成一遍TinUI界面,在此過程中生成對應IDO片段部分python代碼,這里不做贅述。新的變化是能夠直接復制python代碼,同時可以通過注釋生成重點內容。

功能代碼如下:

def copy_pycode(e):#復制textbox.clipboard_clear()copyText = textbox.get(1.0,'end')textbox.clipboard_append(copyText)
def highlight(e):#標注funcs,datas等重點havefunc,havedata=False,Falsetextbox.configure(state='normal')write('\n#TinUIXml導入重點:\n')for i in textbox.result:if i[0]=='funcs':if havefunc==False:havefunc=Truewrite('#函數/方法(funcs):\n')write(f'#  {i[1]}(...)\n')elif i[0]=='datas':if havedata==False:havedata=Truewrite('#數據(datas):\n')write(f'#  {i[1]}=...\n')havetag=Falsefor tag in duixml.tags.keys():if havetag==False:havetag=Truewrite('\n#TinUIXml導出重點:\n')write(f'#  {tag}\n')textbox.configure(state='disabled')

在這里插入圖片描述

十字線定位

TinUIXml只是解決了每塊包含若干控件元素的行元素默認布局問題,但是行元素<line>的起始位置是可以自定義的,同時,行元素內部也可以嵌套新的行元素,起始位置也可以自定義。如果我們要在TinUIXml布局時也保持絕對坐標布局的靈活性,就需要知道在當前xml布局(新xml布局編寫之前)下,界面元素所占的空間位置狀態。

在新TinUIXml編輯器中,直接使用了BasicTinUI自帶的設計模式,通過display.show_location控制開啟和關閉。

TinUI(BasicTinUI)設計模式在5.1版本中加入。

loclines=False#坐標十字線是否存在
def if_location(e):#是否顯示坐標十字線global loclinesloclines=eif loclines:tinui.itemconfig(loctext,state='normal')displayui.show_location(command=getloc)else:tinui.itemconfig(loctext,text='x:? y:?',state='hidden')displayui.show_location(False)def getloc(x,y):tinui.itemconfig(loctext,text=f'x:{x} y:{y}')

在這里插入圖片描述

標記點繪制

在新TinUIXml編輯器中,我們設計右鍵單擊繪制標記點,這個功能非常簡單,就先不在這里給出詳細代碼,稍后會隨標記點的管理給出。不過需要注意的是,當ui界面重繪,也就是inxml()方法執行后,我們也需要重繪這些點,因此,我們使用mark_points:list=[]來記錄這些點的位置信息和畫布對象id。

只需要在inxml()后加入reset_marks()即可。

def inxml(e):#注入xml界面xml=text.get(1.0,'end')duixml.funcs=dict()duixml.datas=dict()duixml.tags=dict()result=re.findall("self\.(.*?)\[.(.*?).\]'",xml,re.M|re.S)for i in result:if i[0]=='funcs':duixml.funcs[i[1]]=Noneelif i[0]=='datas':duixml.datas[i[1]]=(None,None)duixml.yendy=5duixml.clean()duixml.loadxml(xml)rescroll()reset_marks()#!!!def reset_marks():#重新繪制標記點if len(mark_points)==0:returnindex=1for i in mark_points[1:]:mark=displayui.create_oval((i[0][0],i[0][1],i[0][0]+3,i[0][1]+3),outline='red',fill="red")mark_points[index]=(i[0],mark)index+=1

標記點管理

僅僅有十字線坐標定位是不夠的,有時候,我們需要記錄幾個關鍵標記點,比如窗口大小對角點、預留控件位置等等。在新TinUIXml編輯器中,我們可以通過另一個窗口,來管理這些標記點。

窗口布局marks.xml

<!--標記點控制窗口-->
<tinui>
<line y='14' anchor='w'><paragraph text='鼠標右鍵單擊確立標記點'></paragraph><button2 text='刪除標記點' command='self.funcs["del_mark"]'></button2>
</line>
<line><listbox data='("TinUIXml編輯器標記點",)' width="365" height="535" command='self.funcs["sel_mark"]'>listbox</listbox>
</line>
</tinui>

這個窗口中的listbox列表框,就是我們的主要交互方式,我們也需要保持mark_points列表與列表框的同步更新。

now_mark=None#mark_index
def open_markw(e):markw.deiconify()
def del_mark(e):#刪除選定標記點global now_markif now_mark==None:returnlistbox.delete(now_mark)displayui.delete(mark_points[now_mark][1])del mark_points[now_mark]now_mark=None
def sel_mark(name):#選定標記點global now_markif name.index==0:now_mark=Noneelse:if now_mark!=None:displayui.itemconfigure(mark_points[now_mark][1],outline='red',fill="red")now_mark=name.indexdisplayui.itemconfigure(mark_points[now_mark][1],outline='blue',fill='blue')
def __set_mark(x,y):mark=displayui.create_oval((x,y,x+3,y+3),outline='red',fill="red")mark_points.append(((x,y),mark))listbox.add(f'({x} , {y})')
def set_mark(e):#繪制標記點__set_mark(e.x,e.y)

注意其中每次listbox的變動,都要伴隨mark_points的變動,UI展示區域則視情況而定。

在這里插入圖片描述
至此,完成一個新的TinUIXml簡易編輯器。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/45270.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/45270.shtml
英文地址,請注明出處:http://en.pswp.cn/web/45270.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

docker私有倉庫harbor安裝

Harbor默認安裝 下載harbor https://github.com/goharbor/harbor/releases/download/v2.11.0/harbor-offline-installer-v2.11.0.tgz 目前要求docker版本&#xff0c;docker 20.10.10-ce &#xff0c;和docker-compose 1.18.0 查看 docker-compose版本 docker-compose --ver…

Django前后端打通

跨域問題 【 0 】前言 ? ? 同源策略&#xff08;Same Origin Policy&#xff09;是瀏覽器安全策略的重要組成部分&#xff0c;它限制了來自不同源的網頁之間的數據交互&#xff0c;以防止惡意攻擊。當一個網頁嘗試執行與它的源&#xff08;即協議、域名和端口&#xff09…

【區分vue2和vue3下的element UI Carousel 走馬燈組件,分別詳細介紹屬性,事件,方法如何使用,并舉例】

在 Vue 2 中&#xff0c;我們通常使用 Element UI&#xff0c;而在 Vue 3 中&#xff0c;我們則使用 Element Plus 作為其替代品。對于 Carousel 走馬燈組件&#xff0c;這兩個庫提供了相似的功能&#xff0c;但在 Vue 2 和 Vue 3 的上下文中&#xff0c;它們的屬性、事件和方法…

C\C++ 終端輸出帶有顏色的字符

終端顯示帶有顏色的字符 終端顯示帶有顏色的字符 終端顯示帶有顏色的字符背景&#xff1a;測試機器&#xff0c;win10系統&#xff0c; VS2022編寫字體設置不同的顏色背景色光標移動 &#xff08;這個用的估計不是很多&#xff09;字體設置動態顯示C cout 也可以測試代碼準確的…

接口基礎知識3:詳解url

課程大綱 一、定義 URL即訪問的鏈接&#xff0c;是Uniform Resource Locator的縮寫&#xff0c;譯為"統一資源定位符"。 URL是一種URI&#xff0c;它標識一個互聯網資源&#xff0c;并指定對其進行操作或獲取該資源的方法。可能通過對主要訪問手段的描述&#xff0c…

SpringBoot詳細解析

1.什么是springboot springboot也是spring公司開發的一款框架。為了簡化spring項目的初始化搭建的。那么spring對應springboot有什么缺點呢&#xff1f; spring項目搭建的缺點: 配置麻煩依賴tomcat啟動慢 2.springboot的特點 自動配置 Spring Boot的自動配置是一個運行時&…

Docker 安裝ros 使用rviz 等等圖形化程序

Docker 安裝ros 使用rviz 等等圖形化程序 ubuntu 版本與ros 發行版本對應 如何安裝其它版本ros 此時考慮使用docker 易于維護 地址&#xff1a; https://hub.docker.com/r/osrf/ros 我主機是 ubuntu22.04 使用這個標簽 melodic-desktop-full 1 clone 鏡像到本機 docker pu…

Android OkHttp3中HttpLoggingInterceptor使用

目錄 一 概述1.1 日志級別 二 使用2.1 引入依賴2.2 創建對象2.3 添加攔截器 三 結果展示3.1 日志級別為BODY3.2 日志級別為BASIC3.3 日志級別為HEADERS 參考 一 概述 HttpLoggingInterceptor是OkHttp3提供的攔截器&#xff0c;用來記錄HTTP請求和響應的詳細信息。 1.1 日志級…

基于IDEA的Lombok插件安裝及簡單使用

lombok介紹 Lombok能以注解形式來簡化java代碼&#xff0c;提高開發效率。開發中經常需要寫的javabean&#xff0c;都需要花時間去添加相應的getter/setter&#xff0c;也許還要去寫構造器、equals等方法&#xff0c;而且需要維護。而Lombok能通過注解的方式&#xff0c;在編譯…

Spring AOP 實現 Excel 導出統一處理

你好&#xff0c;我是柳岸花開。在實際開發中&#xff0c;經常會遇到需要導出 Excel 數據的需求。為了避免代碼重復&#xff0c;我們可以使用 Spring AOP&#xff08;面向切面編程&#xff09;來實現 Excel 導出的統一處理。本文將介紹如何使用 Spring AOP 在項目中統一處理 Ex…

【學習筆記】無人機(UAV)在3GPP系統中的增強支持(十三)-更換無人機控制器

引言 本文是3GPP TR 22.829 V17.1.0技術報告&#xff0c;專注于無人機&#xff08;UAV&#xff09;在3GPP系統中的增強支持。文章提出了多個無人機應用場景&#xff0c;分析了相應的能力要求&#xff0c;并建議了新的服務級別要求和關鍵性能指標&#xff08;KPIs&#xff09;。…

枚舉的高階用法之枚舉里寫方法以及注入spring的bean

1、前言 一般我們使用枚舉都是用來定義一些常量。比如我們需要一個表示訂單類(pc訂單、手機訂單)的常量,那我們就可以使用枚舉來實現,如下: AllArgsConstructor public enum OrderTypeEnum{PC("PC", "電腦端"),PHONE("PHONE", "手機端&quo…

[計網初識2]web的3個核心標準html,url,http

學習內容 HTML,URL,HTTP的構成 1.規范web的3個核心標準&#xff1f; HTML(Hyper Text Markup Language),規范網頁內容和版面布局的表示標準。URL(Uniform Resource Locator)&#xff0c;規范網頁識別符格式和含義的表示標準。HTTP(HyperText Transfer Protocl),規范游覽器如…

JIRA的高級搜索JIRA Query Language(JQL)詳解

JIRA的高級搜索功能非常強大&#xff0c;允許用戶通過JIRA Query Language&#xff08;JQL&#xff09;來構建復雜的查詢。以下是一些常用的高級搜索用法和示例&#xff1a; 1. 基本語法 JQL的基本語法包括字段、運算符和值的組合。例如&#xff1a; field operator value2.…

<數據集>UA-DETRAC車輛識別數據集<目標檢測>

數據集格式&#xff1a;VOCYOLO格式 圖片數量&#xff1a;20500張 標注數量(xml文件個數)&#xff1a;20500 標注數量(txt文件個數)&#xff1a;20500 標注類別數&#xff1a;4 標注類別名稱&#xff1a;[car, van, others, bus] 序號類別名稱圖片數框數1car201871259342…

鋇錸ARMxy控制器在智能網關中的應用

隨著IoT物聯網技術的飛速發展&#xff0c;智能網關作為連接感知層與網絡層的樞紐&#xff0c;可以實現感知網絡和通信網絡以及不同類型感知網絡之間的協議轉換。鋇錸技術的ARMxy系列控制器憑借其高性能、低功耗和高度靈活性的特點&#xff0c;在智能網關中發揮了關鍵作用&#…

數據結構回顧(Java)

1.數組 線性表 定義的方式 int[] anew int[10] 為什么查詢快&#xff1f; 1.可以借助O(1)時間復雜度訪問某一元素&#xff0c; 2.地址連續&#xff0c;邏輯連續 3.數組長度一旦確定就不可以被修改 當需要擴容的時候需要將老數組的內容復制過來 在Java中數組是一個對象 Ar…

bug定位策略

前提--用戶環境層面 hosts異常&#xff1a;hosts文件主要是加快某個域名或者網站的解析速度&#xff0c;從而達到快速訪問的作用&#xff0c;也可以屏蔽網站。hosts異常可能會導致部分網頁無法訪問&#xff0c;能夠加載&#xff0c;但是網頁無法正常顯示&#xff1b;測試環境臟…

記錄些Redis題集(2)

Redis 的多路IO復用 多路I/O復用是一種同時監聽多個文件描述符&#xff08;如Socket&#xff09;的狀態變化&#xff0c;并能在某個文件描述符就緒時執行相應操作的技術。在Redis中&#xff0c;多路I/O復用技術主要用于處理客戶端的連接請求和讀寫操作&#xff0c;以實現高并發…

Python_使用pyecharts構建折線圖

Pyecharts簡介 Pyecharts是一款將python與echarts結合的強大的數據可視化工具&#xff0c;使用 pyecharts 可以生成獨立的網頁&#xff0c;也可以在 flask , Django 中集成使用。echarts &#xff1a;百度開源的一個數據可視化 JS 庫&#xff0c;主要用于數據可視化。pyechart…