【问题标题】:Event triggered by Listbox and Radiobutton in TkinterTkinter 中由 Listbox 和 Radiobutton 触发的事件
【发布时间】:2014-10-13 05:58:31
【问题描述】:

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

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)

只要我在选择列表框中的项目之前选择了一个单选按钮,一切都会很好。但是每次我选择另一个单选按钮时,它都会返回:

TypeError: getScript() takes exactly 1 argument (0 given)

【问题讨论】:

    标签: python listbox tkinter radio-button eventhandler


    【解决方案1】:

    当您选择单选按钮时会发生什么:

    1) intVar rb 设置为按钮值

    2) 调用 getScript 命令。

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

    使用 lambda 函数调用该函数以提供一个参数作为您的命令 getScript 期望一个参数(即错误消息)。

    R1 = Radiobutton(frame2, text = "Parallel Test",
                     variable = rb, value = 1,
                     command = lambda : getScript(None) )
    

    另一个选项是 - 因为您的目标似乎是知道选择了哪个小部件 - 使用这样的命令:

    R1 = Radiobutton(frame2, text = "Parallel Test",
                     variable = rb, value = 1,
                     command = lambda : getScript(R1) )
    

    使用带有小部件的 getSript 函数。像这样:

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

    【讨论】:

    • 第一个解决方案对我来说很好。如果我使用第二种解决方案,是否意味着我不必在 getScript 函数中添加“事件”参数?它会改变列表框与函数的绑定吗?如果我不需要将事件添加到函数参数,我只是好奇如何从事件中触发函数。提前致谢
    • 如果调用的函数不依赖于鼠标位置等事件参数,则可以在不提供事件的情况下调用事件函数。例如,当将None 传递给您的函数时,您是在说没有事件......所以您只是在事件上调用一个函数,而不需要它作为函数参数;)。我的第二个提议让您知道选择了哪些小部件而无需对 rb 进行全局调用,仅此而已。你可以想象一个没有任何参数的函数调用,它使用 rb 值工作。您只需删除 event 参数即可。
    猜你喜欢
    • 2017-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2012-02-03
    • 2014-02-16
    • 1970-01-01
    相关资源
    最近更新 更多