Я новичок, самообучающийся, Ткинтер. Я хочу достичь ниже GUI, который был в моей голове. Цель этого интерфейса - сравнить значения тегов двух идентичных структурированных XML. Я должен быть в состоянии открыть два XML и сравнить оба значения тега значений сетки левой и правой панели. всегда левая и правая XML-структуры будут согласованы, за исключением значений, которые могут отличаться или отсутствовать.
Ниже приведен код, который мне удалось написать со ссылкой на Google и stackoverflow.
broker1.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<Broker>
<object name="Books">
<property name="name1"/>
<property name="name2" value="value2"/>
<property name="name3"/>
<property name="name4"/>
<property name="name5" value="value5"/>
</object>
<object name="furniture">
<property name="furniture1"/>
<property name="furniture2"/>
<property name="furniture3" value="furniturevalue3"/>
</object>
</Broker>
broker2.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<Broker>
<object name="Books">
<property name="name1"/>
<property name="name2"/>
<property name="name3"/>
<property name="name4" value="value4"/>
<property name="name5" value="value5"/>
</object>
<object name="furniture">
<property name="furniture1" value1="furniturevalue7"/>
<property name="furniture2"/>
<property name="furniture3" value="furniturevalue3"/>
</object>
</Broker>
Код:
import xml.etree.ElementTree as ET
from tkinter import *
master = Tk()
HEIGHT = 700
WIDTH = 1024
canvas = Canvas(master,height= HEIGHT , width = WIDTH)
canvas.pack()
frame = Frame(master,bg = 'yellow')
frame.place(relwidth=1,relheight=1)
left = dict() # dictionary to store name/value pairs of broker1.xml
right = dict() ## dictionary to store name/value pairs of broker2.xml
tree1 = ET.parse('broker1.xml')
#tree2 = ET.parse('broker2.xml') #yet to code for tree2 for comparision
broker = tree1.getroot()
for child in broker:
if(child.tag == 'object'):
for propertytag in child:
print(propertytag)
if(propertytag.tag == 'property'):
print(propertytag.get('name'),propertytag.get('value'))
left.update({propertytag.get('name'):propertytag.get('value')})
r=len(left)
valuesList = list(left.values())
for key, value in left.items():
entPropertyNameEntry = Entry(frame, readonlybackground='grey' , fg = 'black' , justify=LEFT, width = len(max(left.keys(), key=len)),state='readonly')
keyStringVar = StringVar()
keyStringVar.set(key)
entPropertyNameEntry.config(textvariable=keyStringVar, relief=RIDGE)
entPropertyNameEntry.grid(row=r,column=0)
valueStringVar = StringVar()
valueStringVar.set(value)
entValueEntry= Entry(frame,readonlybackground='white', fg = 'black' , justify=LEFT, width = max(len(str(s)) for s in valuesList),state='readonly')
entValueEntry.config(textvariable=valueStringVar, relief=SUNKEN)
entValueEntry.grid(row=r,column=1)
r = r - 1
master.mainloop()
Я могу сгенерировать пару имя / значение в 2 столбцах, но не смог добиться прокрутки, которая настраивается в зависимости от длины словарей.
Пример макета:
