2012-04-10 192 views
2

我正在为我的餐厅的员工进行菜单测试。该计划是菜单项来遍历“环路项目在这里”此时,他们选择了正确的checkbuttons(成分),然后点击“提交并继续按钮”。当他们点击提交按钮时,我首先需要读取检查按钮的开关值,以确定他们选择了哪些项目,然后将这些值与我在列表字典中定义的正确答案进行比较,然后清除所有检查按钮以及是否答案是错误的或正确的程序将继续,我最终会有一个结果屏幕,但现在我坚持如何读取开关值的检查按钮。我只是试图打印选定的蔬菜,现在无法弄清楚。Python 3.2 tkinter通过for循环添加读取checkbutton值

我认为这与它们在不同方法中的事实以及它们被添加到循环中的事实有关?我不确定,但我知道我的代码正在尝试阅读错误的东西,任何帮助都会被感谢!

对不起,冗长的问题,我只是认为这将是有益的给你尽可能多的信息尽可能地了解我试图做...

enter image description here

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

附注:类的好处之一是,你可以在'__init__'中插入类似self.count的东西,从而避免使用全局关键字。 – 2012-04-10 12:25:17

回答

4

您可以创建一个字典,并且每个键都是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():
使用项目()中的哪一个需要防止:
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() 
+0

啊,非常感谢你!令人沮丧的是,我早些时候曾经有过类似的东西,我试图使用它,但无法得到它的确定。对此,我真的非常感激。现在开始研究如何存储它们,以便我可以将它们与我的列表字典进行比较...... – crenfro 2012-04-10 13:08:25