我们如何使用循环从数组创建检查按钮并打印所选检查按钮的值?

时间:2016-09-14 12:17:00

标签: python tkinter

我有一个字符串数组,我希望能够使用一个循环来快速为它们创建很多检查按钮,因为这个想法是用户以后可以添加/删除数组中的项目,所以它应该适应性强。

我甚至不确定这是否可以使用我正在尝试使用的方法。下面的代码的问题是它只检查最后一个checkbutton /数组中的最后一项,所以它总是返回PY_VAR3或'd'等。

如果有人可以帮助我理解该怎么做,那将是惊人的,即使它是完全重写代码。我完全难过了。

from Tkinter import *


Window = Tk()

class Test:
    def __init__(self):

        array = ['a', 'b', 'c', 'd']

        def doCheckbutton():
            for i in array:
                self.var = StringVar()
                c = Checkbutton(Window, text='blah', variable=self.var, command=printSelection)
                c.pack()


        def printSelection():
            print(self.var)

        doCheckbutton()

Test()

Window.mainloop()

解决了

from Tkinter import *


Window = Tk()

class Test:
    def __init__(self):

        self.array = ['a', 'b', 'c', 'd']
        self.vars = [] #Array for saved values

        self.doCheckbutton()

    def doCheckbutton(self):
        for i in range(len(self.array)):
            self.vars.append(StringVar()) #create new item in vars array
            c = Checkbutton(Window, text=self.array[i], variable=self.vars[-1], command=lambda i=i: self.printSelection(i), onvalue='on', offvalue='off')
            c.pack()


    def printSelection(self, i):
        print(self.array[i] + ': ' + self.vars[i].get())

Test()

Window.mainloop()

勾选/取消勾选复选键时,会打印出以下语句: c:开 c:关闭

1 个答案:

答案 0 :(得分:1)

您可以为每个CheckBox StringVar创建并将其保存在列表中,然后在get上使用StringVar方法获取其值(lambda为用于在数组列表中传递索引):

from Tkinter import *


Window = Tk()

class Test:
    def __init__(self):

        self.array = ['a', 'b', 'c', 'd']
        self.vars = []

        self.doCheckbutton()

    def doCheckbutton(self):
        for i in range(len(self.array)):
            self.vars.append(StringVar())
            self.vars[-1].set(0)
            c = Checkbutton(Window, text=self.array[i], variable=self.vars[-1], command=lambda i=i: self.printSelection(i), onvalue=1, offvalue=0)
            c.pack()


    def printSelection(self, i):
        print(self.vars[i].get())

Test()

Window.mainloop()

我希望这会有所帮助。