复选框更改标签状态,tkinter

时间:2018-04-11 10:05:15

标签: python tkinter

我最近开始使用tkinter,尝试为til系统创建一个非常基本的GUI。我们的想法是有8个复选框,代表8个不同的项目,勾选或取消勾选复选框后,显示订单总价的标签会相应更改。

此处的代码显示了我目前与复选框和价格相关的内容。我希望LabelP(价格标签)显示在任何给定时间在菜单上选择的价格。我目前的尝试似乎并不奏效。我对tkinter一般都比较新,所以任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:0)

这样的事情怎么样?我正在使用字典来存储每个项目的复选框,价格,名称和变量(保存已选中/未选中的值)。 如果选中了复选框,则重新计算方法。 重新计算方法查看选择了哪些项目,并将其价格添加到屏幕上显示的总数中。 这样您就不必对每个项目进行“硬编码”,只需在stock_items列表中添加一个新项目,它就会在您运行代码时显示在屏幕上。 比你的例子更先进,但会做你想要的。

try:
    import tkinter as tk
except:
    import Tkinter as tk

import time

#Create an array containing our stock items
#Each item is a dictionary with price and name fields
stock_items = []
stock_items.append({'price':2.0,'name':'Item 1'})
stock_items.append({'price':1.5,'name':'Item 2'})
stock_items.append({'price':5,'name':'Item 3'})
stock_items.append({'price':7,'name':'Item 4'})

class Till(tk.Frame):
    def __init__(self,master=None,**kw):
        tk.Frame.__init__(self,master=master,**kw)
        self.price_string=tk.StringVar()
        tk.Label(self,text="Price: ").grid(row=0,column=0)
        tk.Label(self,textvariable=self.price_string).grid(row=0,column=1)
        self.items = []
        #For each stock item, create an IntVar, a checkbox and keep record of the price/name
        for idx,item in enumerate(stock_items):
            new_item = {}
            new_item['var'] = tk.IntVar()
            new_item['check'] = tk.Checkbutton(self,
                                                  text=item['name'],
                                                  variable=new_item['var'],
                                                  command=self.recalculate)
            new_item['check'].grid(row=idx+1)
            new_item['name'] = item['name']
            new_item['price'] = item['price']
            self.items.append(new_item)


    #Recalculate is called when ever a checkbox is checked/unchecked
    def recalculate(self):
        total_price = 0
        #Go through each item and if it is selected add its price to the total
        for item in self.items:
            if item['var'].get():
                total_price += item['price']
        #Display out total price
        self.price_string.set('£/$ {:.2f}'.format(total_price))


if __name__ == '__main__':
    root = tk.Tk()
    Till(root).grid()
    root.mainloop()