在Tkinter中创建动态函数数量并作为命令调用

时间:2019-02-27 09:00:11

标签: python function loops 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()

0 个答案:

没有答案