从 Tkinter 中的 Entry 小部件将参数传递给动态创建的 Button

Passing parameters to a dynamically created Button from an Entry widget in Tkinter

我正在寻找一种将条目小部件的内容传递给按钮的方法。 对我来说,复杂的部分是按钮和条目小部件是从给定的 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()

您可以保留您创建的所有条目的二维列表。然后当你想访问它们时,你只需要插入行号。实施示例:

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']