tkinter读取通过for循环添加的checkbutton值

时间:2012-04-10 03:17:20

标签: python loops checkbox python-3.x tkinter

我正在为我餐厅的员工进行菜单测试。计划是菜单项循环“ 循环项目 ”,此时他们选择正确的支票(成分),然后点击“ 提交并继续按钮 “。当他们单击提交按钮时,我首先需要读取检查按钮的开启和关闭值以确定他们选择了哪些项目,然后将它们与我在列表字典中定义的正确答案进行比较,然后清除所有检查按钮以及是否答案是错误的或正确的程序将继续,我将最终有一个结果屏幕,但现在我仍然坚持如何阅读检查按钮的开启和关闭值。我现在只是想尝试打印选定的蔬菜而无法弄明白。

我认为这与他们使用不同方法的事实以及它们是在循环中添加的事实有关吗?我不确定,但我知道我的代码试图读错了,任何帮助都会受到热烈的赞赏!

对于这个冗长的问题我很抱歉,我认为尽可能多地提供信息以了解我要做的事情是有益的。

screenshoot

from tkinter import *

class GUI(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent)
        self.parent = parent
        self.initUI()

    def initUI(self):
        self.grid()
        self.parent.title("Wahoos Menu Test")
        self.create_buttons()

    global count
    count = -1

    def create_buttons(self):
        for r in range(20):
            for c in range(14):
                Label(self, text='',
                    borderwidth=0).grid(row=r,column=c)
        B = Button(self, text ="Begin Exam", relief=RIDGE, fg="black", command= self.on_button_press).grid(row=19, column=7)
        L = Label(self, text="What comes in the following", fg="blue").grid(row=6, column=0)
        self.veg = ['Lettuce', 'Cabbage', 'Cheese', 'Ahee Rice', 'Brown Rice', 'Banzai Veg', 'Red Cabbage', 'Black Beans', 'Cajun White Beans']
        self.vegboxes = []
        self.opt = []
        c = 1
        for ve in self.veg:
            c +=1
            self.v = IntVar()
            self.vegboxes.append(self.v)
            vo = Checkbutton(self, text=ve, variable=self.v, onvalue=1, offvalue=0).grid(row=c, column=11, sticky=W)

    def on_button_press(self):
        global count
        count = count + 1
        menuItems = {'nft': ['cabbage', 'cheese', 'corn', 'nf', 'salsa'],
        'nckt': ['lettuce', 'cheese', 'corn', 'nck', 'salsa']}
        menu = ['blackened fish taco', 'wahoos chicken salad']
        if count == len(menu):
            C = Button(self, text ="           Your Done!          ", relief=RIDGE, fg="black").grid(row=19, column=7)
        else:
            m = Label(self, text=menu[count], fg="black").grid(row=7, column=0)
            C = Button(self, text ="Submit and Continue", relief=RIDGE, fg="black", command= self.read_checks).grid(row=19, column=7)
    def read_checks(self):
        for v in self.veg:
            if self.v == 1:
                print(self.veg[v])


def main():
    root = Tk()
    app = GUI(root)
    root.mainloop()

if __name__ == '__main__':
    main()

1 个答案:

答案 0 :(得分:5)

您可以创建一个字典,并将每个键设为Checkbutton的标签,
并且值为状态"Control Variable".
然后,您将使用Control Variable的get()方法检查状态,如下例所示。

import tkinter as tk

class GUI(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)

        self.buttonDic = {
        'Brown Rice':0,
        'Banzai Veg':0,
        'Red Cabbage':0,
        'Black Beans':0
        }

        for key in self.buttonDic:
            self.buttonDic[key] = tk.IntVar()
            aCheckButton = tk.Checkbutton(self, text=key,
                                            variable=self.buttonDic[key])
            aCheckButton.grid(sticky='w')

        submitButton = tk.Button(self, text="Submit",
                                        command=self.query_checkbuttons)
        submitButton.grid()

    def query_checkbuttons(self):
        for key, value in self.buttonDic.items():
            state = value.get()
            if state != 0:
                print(key)
                self.buttonDic[key].set(0)

gui = GUI()
gui.mainloop()

此方法允许您使用一个字典创建和分析Checkbuttons 请注意for key, value in self.buttonDic.items():中使用items()的情况 需要防止:
ValueError: too many values to unpack

可以找到有关Checkbutton小部件及其变量的更多信息:here


我将把我的第一次尝试包括在内 Checkbutton小部件的onvalueoffvalue
如果它有助于某人理解控制变量。

import tkinter as tk

class GUI(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)

        self.bRiceV = tk.StringVar()
        bRice = tk.Checkbutton(self, text="Brown Rice",variable=self.bRiceV,
                                    onvalue="Brown Rice", offvalue="Off")
        bRice.pack()

        self.bVegV = tk.StringVar()
        bVeg = tk.Checkbutton(self, text="Banzai Veg",variable=self.bVegV,
                                    onvalue="Banzai Veg", offvalue="Off")
        bVeg.pack()

        self.varList = [self.bRiceV, self.bVegV]

        submitButton = tk.Button(self, text="Submit",
                                command=self.query_checkbuttons)
        submitButton.pack()

    def query_checkbuttons(self):
        for var in self.varList:
            value = var.get()
            if value != 'Off':
                print(value)
                var.set('Off')

gui = GUI()
gui.mainloop()