我是新手自学tkinter。我想实现我心目中的低于gui的目标。本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列中生成名称/值对,但无法实现根据字典长度进行调整的滚动。
布局示例: