我正在寻找一种如何将条目小部件的内容传递给按钮的方法。 对我来说,复杂的部分是从给定的XML结构动态创建的按钮和条目小部件,参见'xmlString',它描述了一个带有按钮和参数的GUI,按钮和参数的数量是可变的。
我简化了XML并制作了演示代码。 我知道lambda函数,但我不知道如何使用动态创建的条目小部件。
from Tkinter import *
import xml.etree.ElementTree as ET
rootframe = Tk()
def runScript(text = 'default text'):
print 'runScript %s'%text
xmlString = '''
<window>
<Tab id="tabpage5" name="Debugging" type="custom">
<command dest="1" mode="CONFIG" unit="4" id="SET_TIMEOUT" type="COMMAND">
<initiator name="Set Timeout" type="button" />
<parameter editable="true" param_name="PARAM1">31536000</parameter>
</command>
<command dest="1" mode="CONFIG" unit="4" id="SET_thing" type="COMMAND">
<initiator name="Set Timeout" type="button" />
<parameter param_name="PARAM1" >31536000</parameter>
<parameter param_name="PARAM2">5</parameter>
</command>
<command />
</Tab>
</window>
'''
xmlRoot = ET.fromstring(xmlString)
for tab in xmlRoot.iter('Tab'):
row = 0
column = 0
for command in tab.iter('command'):
for tag in command.iter() :
#not sure why command tag is here but skipping it
if tag.tag == 'command':
pass
continue
if tag.tag == 'initiator' and tag.attrib['type'] == 'button':
button = Button(rootframe, text=tag.attrib['name'], command=lambda : runScript('nondefault text'))
button.grid(row=row, column=column, sticky='w')
column +=1
elif tag.tag == 'parameter':
entry = Entry(rootframe)
entry.insert(0,tag.text)
entry.grid(row=row, column=column)
column +=1
row +=1
column = 0
rootframe.mainloop()
答案 0 :(得分:0)
您可以保留您创建的所有条目的2D列表。然后,当您想要访问它们时,您只需要插入行号。示例实施:
from Tkinter import *
import xml.etree.ElementTree as ET
rootframe = Tk()
def runScript(text = 'default text', row=None):
entries = entries_by_row[row] if row is not None else []
print 'runScript {}. Contents of entries: {}'.format(text, [entry.get() for entry in entries])
xmlString = '''
<window>
<Tab id="tabpage5" name="Debugging" type="custom">
<command dest="1" mode="CONFIG" unit="4" id="SET_TIMEOUT" type="COMMAND">
<initiator name="Set Timeout" type="button" />
<parameter editable="true" param_name="PARAM1">31536000</parameter>
</command>
<command dest="1" mode="CONFIG" unit="4" id="SET_thing" type="COMMAND">
<initiator name="Set Timeout" type="button" />
<parameter param_name="PARAM1" >31536000</parameter>
<parameter param_name="PARAM2">5</parameter>
</command>
<command />
</Tab>
</window>
'''
xmlRoot = ET.fromstring(xmlString)
entries_by_row = []
for tab in xmlRoot.iter('Tab'):
row = 0
column = 0
for command in tab.iter('command'):
entries_by_row.append([])
for tag in command.iter() :
#not sure why command tag is here but skipping it
if tag.tag == 'command':
pass
continue
if tag.tag == 'initiator' and tag.attrib['type'] == 'button':
button = Button(rootframe, text=tag.attrib['name'], command=lambda row=row: runScript('nondefault text', row))
button.grid(row=row, column=column, sticky='w')
column +=1
elif tag.tag == 'parameter':
entry = Entry(rootframe)
entry.insert(0,tag.text)
entry.grid(row=row, column=column)
column +=1
entries_by_row[-1].append(entry)
row +=1
column = 0
rootframe.mainloop()
点击每个按钮后的结果:
runScript nondefault text. Contents of entries: ['31536000']
runScript nondefault text. Contents of entries: ['31536000', '5']