首页 > 解决方案 > 在 Tkinter 中创建动态数量的函数并作为命令调用

问题描述

我在 python 中的 tkinter 中有两个单独的检查按钮列,具有相同的标签。

我的目标是在另一列中选择同一项目时禁用其中一列中的那些。

我可以在类和函数之外执行此操作,但在调用函数中的变量时遇到了麻烦。

当我为动态参数插入静态值并删除命令函数创建循环以禁用按钮时,它可以完美运行。然而,每当我使用循环时,我都会收到“AttributeError:'tool' 对象没有属性'dsblr0'”响应。

如何访问循环创建的函数,以便在第一列中检查相同项目时禁用第二列中的框?

任何帮助是极大的赞赏!

我当前的代码:

from tkinter import *
from tkinter import messagebox

buttonnames = []
class tool(Frame):
    def get_button_names(self):
        self.buttonnames=['b1','b2','b3','b4','b5']
        global buttonnames
        for item in self.buttonnames:
            buttonnames.append(item)

    def __init__(self, parent):
        '''
        Constructor
        '''
        Frame.__init__(self, parent)
        self.parent=parent
        self.get_button_names()
        self.display_new_window()

    for i in range(len(buttonnames)):
        exec('''def dsblr{0}(self):
    self.bcb{0}.config(state=DISABLED if self.var{0}.get() else NORMAL)'''.format(i,))

    def display_new_window(self):
        """ Transpose tools
        """
        self.parent.title("Tool")

        self.parent.grid_rowconfigure(0, weight=1)
        self.parent.grid_columnconfigure(0, weight=1)

        for i,column in enumerate(self.buttonnames):
            exec('self.var{0}=IntVar()'.format(i,))
            exec('self.bvar{0}=IntVar()'.format(i,))
            exec('self.cb{0} = Checkbutton(self.parent, text=column, variable=self.var{0},command=self.dsblr{0})'.format(i,))
            exec("self.cb{0}.grid(row=i+1,column=0,sticky='w')".format(i,))
            exec('self.bcb{0} = Checkbutton(self.parent, text=column, variable=self.bvar{0})'.format(i,))
            exec("self.bcb{0}.grid(row=i+1,column=1,sticky='w')".format(i,))

def main():
    root=Tk()
    d=tool(root)
    root.mainloop()

if __name__=="__main__":
    main()

标签: pythonfunctionloopstkinter

解决方案


推荐阅读