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

时间:2015-02-04 15:48:30

标签: python button dynamic callback 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()

1 个答案:

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