Python Tkinter中的列表框和单选按钮触发的事件

Python Tkinter中的列表框和单选按钮触发的事件,python,listbox,tkinter,radio-button,eventhandler,Python,Listbox,Tkinter,Radio Button,Eventhandler,我想创建一个事件,该事件由列表框选定项的更改或单选按钮选定项的更改触发。可能吗?我使用以下代码: def getScript(event): state = rb.get() listScript = [] processor = () processor = lb1.get(lb1.curselection()) if processor : if (state == 1): print processor

我想创建一个事件,该事件由列表框选定项的更改或单选按钮选定项的更改触发。可能吗?我使用以下代码:

def getScript(event):
    state = rb.get()
    listScript = []
    processor = ()
    processor = lb1.get(lb1.curselection())
    if processor :
        if (state == 1):
            print processor
        if (state == 2):
            pass
        if (state == 3):
            pass


frame2 = Frame(top)
frame2.pack(fill = X)
rb = IntVar()

R1 = Radiobutton(frame2, text = "Parallel Test", 
                 variable = rb, value = 1, command = getScript)
R2 = Radiobutton(frame2, text = "Non Parallel Test", 
                 variable = rb, value = 2, command = getScript)
R3 = Radiobutton(frame2, text = "Specific Test", 
                 variable = rb, value = 3, command = getScript)

R1.grid(row = 0, column = 0, padx = 10)
R2.grid(row = 0, column = 1, padx = 10)
R3.grid(row = 0, column = 2, padx = 10)

frame3 = Frame(top)
frame3.pack(fill = X)
space_frame3 = Frame(frame3, width = 10)
l5 = Label(frame3, text = "Processor Unit")
l6 = Label(frame3, text = "Script for test")
lb1 = Listbox(frame3, height = 7, exportselection = 0)
lb1.bind('<<ListboxSelect>>',getScript)
scrollbar = Scrollbar(frame3)
lb2 = Listbox(frame3, height = 7, width = 40, 
              yscrollcommand = scrollbar.set, exportselection = 0)

选择单选按钮时会发生以下情况:

1) intVar
rb
设置为按钮值

2) 调用命令getScript

但是,单选按钮选择不会生成任何事件,这就是为什么在这种情况下有两个选项:

使用lambda函数调用该函数,以提供一个参数作为命令
getScript
expect一个参数(这是错误消息)

另一个选项是——似乎您的目的是了解选择了什么小部件——使用这样的命令:

R1 = Radiobutton(frame2, text = "Parallel Test",
                 variable = rb, value = 1,
                 command = lambda : getScript(R1) )
使用获取小部件的
getSript
函数。像这样:

def getSript(widget):
    print widget["text"]

第一个解决方案对我来说很好。如果使用第二种解决方案,是否意味着不必向getScript函数添加“event”参数?它是否更改了listbox与函数的绑定?我只是好奇,如果不需要将事件添加到函数参数中,如何从事件触发函数。如果调用的函数不依赖于事件参数(如鼠标位置),则可以在事件上调用函数而不提供事件。例如,将
None
传递给函数时,表示没有事件。。。因此,您完全是在事件上调用函数,而不需要将其作为函数参数;)。我的第二个建议是,不需要全局调用rb就可以知道选择了哪些小部件,仅此而已。您可以想象一个函数在没有任何参数的情况下使用rb值进行调用。您只需删除
事件
参数,它就会工作。
R1 = Radiobutton(frame2, text = "Parallel Test",
                 variable = rb, value = 1,
                 command = lambda : getScript(R1) )
def getSript(widget):
    print widget["text"]