如何从字典中求和

时间:2019-04-28 18:02:32

标签: python python-3.x tkinter

我正在尝试制作与在商店下订单有关的程序。整个代码是关于下订单的页面的,然后创建标签列表。一切都做得很好,但是我无法获得全部价格。这是我的代码:

def blnclick():
    n=0
    uprice = price.get()
    uitem = item.get()
    order = {'items': uitem, 'price': uprice}
    lab = order['items']
    lab1 = order['price']
    total = int(lab1)
    c = Canvas(canvas_frme, bg='white', bd=10, width=10, height=50)
    c.pack()
    for values in order:
        Label(c, text=lab, bg='white', font=('candara', 19)).grid(row=n, column=0)
        Label(c, text=lab1, bg='white', font=('candara', 19)).grid(row=n, column=1)
        totSum.set(total)
        total = total+total

非常感谢您的帮助。

更新:我认为代码并不擅长处理字典,因为每次我尝试使用新代码来汇总价格时,它总会汇总一次输入的Didgit,然后插入新条目后重置。任何东西。 请注意,我仍然是python的学习者/学生,因此可以接受代码中的任何有效更改。

更新#2 ,当您去购物时,您购买了多个商品,然后列出了商品总金额。我正试图做到这一点。我是一名学习者,随时可以根据您的需要更改代码,而且我犯了很多次错误。谢谢大家

3 个答案:

答案 0 :(得分:0)

我只会使用列表推导来获取列表中的所有数字并将它们相加

# sample dict 
d = {"one":1, "two":2, "three":3}

# for each key, get it's "price", sum list
x = sum([d[k] for k in d])

答案 1 :(得分:0)

使用sum真的很简单:

total = sum(int(value) for key, value in order.items())

答案 2 :(得分:0)

当前,您创建的本地变量total不能保留较旧的值。
此外,您还要分配新值total = int(lab1),以便删除较早的值。

您需要全局变量(global total)才能始终保持总价值。
然后,您可以将新值添加到total中,以保留旧值。

要将小部件添加到画布,您必须使用canvas_window((x,y), widget)
我们使用pack() / grid()将小部件添加到其他小部件,例如Frame。现在你有些混乱。

我使用Frame,并且跳过了颜色和字体等不重要的选项。

#global variable 
total = 0 # value as start

# to keep all orderde items
#order = []

# to display total value 
#total_label = Label(root, text='')
#total_label.pack()

def blnclick():

    uprice = price.get()
    uitem = item.get()

    global total
    total += int(uprice) # add to global value

    # display new total
    #total_label['text'] = str(total)

    # add ordered item to list
    #order.append({'item': uitem, 'price': uprice})

    frame = Frame(canvas_frme)
    frame.pack()

    l = Label(frame, text=uprice)
    l.grid(row=0, column=0)

    l = Label(frame, text=uitem)
    l.grid(row=1, column=1)

编辑:

完整的示例

import tkinter as tk

# --- functions ---

def on_button_add():

    uprice = price_entry.get()
    uitem = item_entry.get()

    global total
    total += int(uprice) # add to class value

    # display new total
    total_label['text'] = str(total)

    # add ordered item to list
    order.append({'item': uitem, 'price': uprice})
    print('full order:', order)
    print('total:', total)

    number = len(order)

    l = tk.Label(frame_order, text=uitem)
    l.grid(row=number, column=0)

    l = tk.Label(frame_order, text=uprice)
    l.grid(row=number, column=1)

# --- main ---

# values at start
total = 0
order = []

root = tk.Tk()

#--- entry for new item ---

l = tk.Label(root, text='Item:')
l.grid(row=0, column=0)

item_entry = tk.Entry(root)
item_entry.grid(row=0, column=1)

l = tk.Label(root, text='Price:')
l.grid(row=1, column=0)

price_entry = tk.Entry(root)
price_entry.grid(row=1, column=1)

button = tk.Button(root, text='ADD', command=on_button_add)
button.grid(row=2, column=0, columnspan=2)

#--- frame with order ---

frame_order = tk.Frame(root)
frame_order.grid(row=3, column=0, columnspan=2)

l = tk.Label(frame_order, text="Items")
l.grid(row=0, column=0)

l = tk.Label(frame_order, text="Prices")
l.grid(row=0, column=1)

#--- total ---

# to display total value 
l = tk.Label(root, text='Total:')
l.grid(row=4, column=0)

# to display total value 
total_label = tk.Label(root, text='')
total_label.grid(row=4, column=1)

root.mainloop()

enter image description here