提问人:user83975 提问时间:12/22/2021 最后编辑:j_4321user83975 更新时间:12/22/2021 访问量:115
如何使用执行具有不同参数的函数的不同命令制作一个 tkinter 按钮 for 循环?
How can I make a tkinter button for loop with different commands that execute functions with different parameters?
问:
我正在尝试编写一个餐厅应用程序,该应用程序显示所有可用的菜单选项,并在单击菜单项按钮后将项目价格添加到总计中。例如,如果我单击“芝士汉堡”,则 12.99 将添加到总数中,并且底部的标签会自动更新。这是我的代码:
import tkinter as tk
from tkinter import ttk
import tkinter.font as font
from restaurantSoftware import restaurantInfo
import time
try:
from ctypes import windll
windll.shcore.SetProcessDpiAwareness(1)
except:
pass
class restaurantSoftware(tk.Tk):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.title("Restaurant Software POS")
self.frames = dict()
container = ttk.Frame(self)
container.grid(padx=60, pady=30, sticky='EW')
self.sideNavMenu = sideNavMenu(container, self, width=200, height=600)
self.sideNavMenu.grid(row=0, column=0)
style = ttk.Style()
for frameClass in (homeFrame, tableManagementFrame, menuFrame, employeeManagementFrame):
frame = frameClass(container, self)
self.frames[frameClass] = frame
style.configure(f'{frame}.TFrame', background='black')
frame.grid(row=0, column=1, sticky='NESW')
self.show_frame(homeFrame)
def show_frame(self, container):
frame = self.frames[container]
frame.tkraise()
class sideNavMenu(ttk.Frame):
def __init__(self, container, controller, **kwargs):
super().__init__(container, **kwargs)
homeButton = ttk.Button(self, text='Home', command=lambda: controller.show_frame(homeFrame))
tablesButton = ttk.Button(self, text='Table Management', command=lambda: controller.show_frame(tableManagementFrame))
menuButton = ttk.Button(self, text='Menu', command=lambda: controller.show_frame(menuFrame))
employeeButton = ttk.Button(self, text='Employee Management', command=lambda: controller.show_frame(employeeManagementFrame))
homeButton.pack(padx=10, pady=25, fill='both')
tablesButton.pack(padx=10, pady=25, fill='both')
menuButton.pack(padx=10, pady=25, fill='both', )
employeeButton.pack(padx=10, pady=25, fill='both')
class homeFrame(ttk.Frame):
def __init__(self, container, controller, **kwargs):
super().__init__(container, **kwargs)
class tableManagementFrame(ttk.Frame):
def __init__(self, container, controller, **kwargs):
super().__init__(container, **kwargs)
class menuFrame(ttk.Frame):
def __init__(self, container, controller, **kwargs):
super().__init__(container, **kwargs)
self.tableTotal = tk.StringVar()
tableNumber = 12
tableList = []
for table in range(0, tableNumber + 1):
tableList.append(f'Table {table}')
self.availableItems = restaurantInfo.readRestaurantInfo('availableItems.csv')
self.itemList = self.availableItems[0]
self.priceList = self.availableItems[1]
self.categoryList = self.availableItems[2]
self.selectedTable = tk.StringVar()
tableSelector = ttk.Combobox(self, textvariable=self.selectedTable, width=50, font=('Segoe UI', 16))
tableSelector['values'] = tableList
tableSelector['state'] = 'readonly'
tableSelector.set('Set Table Number...')
tableSelector.grid(row=0, column=0, columnspan=3, padx=15, pady=15)
COLUMNS = 3
for i, item in enumerate(self.itemList):
lbl = ttk.Button(self, text=item, style='my.TButton', command=self.calculate(self.priceList[i]))
row, column = divmod(i, COLUMNS)
lbl.grid(row=row + 1, column=column, sticky='news', ipadx=25, ipady=25)
self.tableInfoFrame = ttk.Frame(self)
self.tableInfoFrame.grid()
totalLabel = ttk.Label(self.tableInfoFrame, textvariable=self.tableTotal)
totalLabel.pack()
def calculate(self, amount):
total = 0
total += amount
self.tableTotal.set(total)
class employeeManagementFrame(ttk.Frame):
def __init__(self, container, controller, **kwargs):
super().__init__(container, **kwargs)
root = restaurantSoftware()
font.nametofont("TkDefaultFont").configure(size=15)
root.columnconfigure(0, weight=1) # centers the main content as the window is expanded
root.mainloop()
这是我的程序的样子: https://i.stack.imgur.com/Ngv1G.jpg
这是我的程序读取的 csv:https://i.stack.imgur.com/yU8n4.jpg
答:
1赞
acw1668
12/22/2021
#1
主要问题出在以下代码中:
lbl = ttk.Button(self, text=item, style='my.TButton', command=self.calculate(self.priceList[i]))
它将立即执行并将结果 () 分配给选项。因此,当单击这些按钮时,什么也没发生。self.calculate(self.priceList[i])
None
command
您需要改用带有默认值的参数的 lambda:
bl = ttk.Button(self, text=item, style='my.TButton', command=lambda price=self.priceList[i]: self.calculate(price))
此外,每次执行时都会重置:total
self.calculate()
def calculate(self, amount):
total = 0 # total is reset here
total += amount
self.tableTotal.set(total)
因此,将仅显示点击的商品的价格。self.tableTotal
建议从 更改为 并在其中获取当前总数:self.tableTotal
StringVar
DoubleVar
self.calculate()
class menuFrame(ttk.Frame):
def __init__(self, container, controller, **kwargs):
super().__init__(container, **kwargs)
self.tableTotal = tk.DoubleVar(value=0.0) # Use DoubleVar instead
...
def calculate(self, amount):
total = self.tableTotal.get() # get current total
total += amount
self.tableTotal.set(round(total,2)) # update total
评论