Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python tkinter读取通过for循环添加的checkbutton值_Python_Loops_Checkbox_Python 3.x_Tkinter - Fatal编程技术网

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

Python tkinter读取通过for循环添加的checkbutton值,python,loops,checkbox,python-3.x,tkinter,Python,Loops,Checkbox,Python 3.x,Tkinter,我正在为餐厅的员工做菜单测试。计划是让菜单项在“此处循环项目”中循环,此时他们选择正确的检查按钮(配料),然后单击“提交并继续按钮”。当他们单击提交按钮时,我首先需要读取复选按钮的开和关值,以确定他们选择了哪些项目,然后将它们与我在列表字典中定义的正确答案进行比较,然后清除所有的复选按钮,无论答案是对是错,程序都会继续运行,我最终会有一个结果屏幕,但现在我被困在如何读取复选按钮的开和关值上。我现在只是想打印所选的蔬菜,但我想不出来 我认为这与它们使用不同的方法以及它们被添加到循环中的事实有关?我

我正在为餐厅的员工做菜单测试。计划是让菜单项在“此处循环项目”中循环,此时他们选择正确的检查按钮(配料),然后单击“提交并继续按钮”。当他们单击提交按钮时,我首先需要读取复选按钮的开和关值,以确定他们选择了哪些项目,然后将它们与我在列表字典中定义的正确答案进行比较,然后清除所有的复选按钮,无论答案是对是错,程序都会继续运行,我最终会有一个结果屏幕,但现在我被困在如何读取复选按钮的开和关值上。我现在只是想打印所选的蔬菜,但我想不出来

我认为这与它们使用不同的方法以及它们被添加到循环中的事实有关?我不确定,但我知道我的代码试图读取错误的东西,任何帮助都将非常感谢

很抱歉问了这么长的问题,我只是觉得尽可能多地告诉你我想做的事情会有好处

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()


您可以创建一个字典,并将每个键作为Checkbutton的标签,
并将值设置为状态
然后使用控制变量的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()
此方法允许您使用一个字典创建和分析复选按钮。
注意
中的items()用于self.buttonDic.items()中的键和值:

需要什么来预防:
ValueError:要解压缩的值太多

有关Checkbutton小部件及其变量的更多信息,请参见:


我将包括我的第一次尝试,这是基于
Checkbutton小部件的
onvalue
offvalue

以防它能帮助人们更好地理解控制变量

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()

旁注:类的一个好处是,您可以在
\uuuu init\uuuu
中粘贴self.count之类的内容,从而避免使用全局关键字。啊,非常感谢!令人沮丧的是,我之前有一个类似的东西,我试图用它,但没能把它固定下来。我真的很感激。现在,我要弄清楚如何存储它们,以便将它们与我的列表字典进行比较。。。