首页 > 解决方案 > 试图在 tkinter 中打印我的菜单 gui 的总成本。ERROR = 'int' 对象不可调用

问题描述

嗨,我在尝试将这个菜单聊天机器人变成 gui 时遇到了麻烦,我有一些代码不匹配,一旦在第 108 行单击“完成订单”,我就可以打印所有项目的总成本

所有代码:

    from tkinter import *

cost = 0

class Window(Frame):

    def __init__(self, master=None):
        Frame.__init__(self, master, bg='#DA291C')               
        self.master = master
        self.init_window()
    def init_window(self):
        self.master.title("Maccas Menu")
        self.pack(fill=BOTH, expand=1)
        Label(self, bg='#DA291C', text=" Name: ",fg='#FFC72C').grid(row=0)
        Label(self, bg='#DA291C', text="Address: ",fg='#FFC72C').grid(row=1)
        Label(self, bg='#DA291C', text="Phone: ",fg='#FFC72C').grid(row=2)

        #Customer Details
        self.Name = Entry(self)
        self.Name.grid(row=0, column=1)
        self.Address = Entry(self, state='disabled')
        self.Address.grid(row=1, column=1)
        self.Phone_Number = Entry(self, state='disabled')
        self.Phone_Number.grid(row=2, column=1)

        self.delivery = BooleanVar()
        Checkbutton(self, text="Delivery",fg='#27251F', bg='#DA291C', variable=self.delivery, command=self.check).grid(row=1, column=2)
        Button(self, text='Show',fg='#27251F', bg='#DA291C', command=self.show_entry_fields).grid(row=0, column=2, sticky=W, pady=4, padx=5)

        #Maccas Selection
        Label(self, text = "Maccas", font='bold', fg='#27251F', bg='#DA291C').grid(columnspan=2, pady=(20,5))

        #Maccas Numbers
        self.BigMac_num = IntVar()
        self.Nuggets_num = IntVar()
        self.AngusBurger_num = IntVar()
        self.Wraps_num = IntVar()
        self.SoftServe_num = IntVar()
        self.Fillet_o_Fish_num = IntVar()
        self.HappyMeal_num = IntVar()
        self.Salad_num = IntVar()
        self.Sprite_num_num = IntVar()
        self.Frozen_Coke_num = IntVar()
        self.Apple_Pie_num = IntVar()
        self.Apple_Slices_num = IntVar()

        #Spinbox Labels
        Label(self, text = "BigMac",fg='#FFC72C', bg='#DA291C').grid(row=4)
        Label(self, text = "Nuggets",fg='#FFC72C', bg='#DA291C').grid(row=5)
        Label(self, text = "AngusBurger",fg='#FFC72C', bg='#DA291C').grid(row=6)
        Label(self, text = "Wraps",fg='#FFC72C', bg='#DA291C').grid(row=7)
        Label(self, text = "SoftServe",fg='#FFC72C', bg='#DA291C').grid(row=8)
        Label(self, text = "Fillet'o'Fish",fg='#FFC72C', bg='#DA291C').grid(row=9)
        Label(self, text = "HappyMeal",fg='#FFC72C', bg='#DA291C').grid(row=10)
        Label(self, text = "Salad",fg='#FFC72C', bg='#DA291C').grid(row=11)
        Label(self, text = "Sprite",fg='#FFC72C', bg='#DA291C').grid(row=12)
        Label(self, text = "Frozen Coke",fg='#FFC72C', bg='#DA291C').grid(row=13)
        Label(self, text = "Apple Pie",fg='#FFC72C', bg='#DA291C').grid(row=14)
        Label(self, text = "Apple Slices",fg='#FFC72C', bg='#DA291C').grid(row=15)

        #Spinboxes
        self.BigMac_num = Spinbox(self, from_=0, to=5)
        self.Nuggets_num = Spinbox(self, from_=0, to=5)
        self.AngusBurger_num = Spinbox(self, from_=0, to=5)
        self.Wraps_num = Spinbox(self, from_=0, to=5)
        self.SoftServe_num = Spinbox(self, from_=0, to=5)
        self.Fillet_o_Fish_num = Spinbox(self, from_=0, to=5)
        self.HappyMeal_num = Spinbox(self, from_=0, to=5)
        self.Salad_num = Spinbox(self, from_=0, to=5)
        self.Sprite_num = Spinbox(self, from_=0, to=5)
        self.Frozen_Coke_num = Spinbox(self, from_=0, to=5)
        self.Apple_Pie_num = Spinbox(self, from_=0, to=5)
        self.Apple_Slices_num = Spinbox(self, from_=0, to=5)

        #Spinbox Positioning
        self.BigMac_num.grid(row=4, column=1)
        self.Nuggets_num.grid(row=5, column=1)
        self.AngusBurger_num.grid(row=6, column=1)
        self.Wraps_num.grid(row=7, column=1)
        self.SoftServe_num.grid(row=8, column=1)
        self.Fillet_o_Fish_num.grid(row=9, column=1)
        self.HappyMeal_num.grid(row=10, column=1)
        self.Salad_num.grid(row=11, column=1)
        self.Sprite_num.grid(row=12, column=1)
        self.Frozen_Coke_num.grid(row=13, column=1)
        self.Apple_Pie_num.grid(row=14, column=1)
        self.Apple_Slices_num.grid(row=15, column=1)

        self.Total_Maccas_num = IntVar()

        Button(self, text='Finish Order',fg='#27251F',bg='#DA291C', command=self.Maccas_Submit).grid(row=16, column=0, sticky=W, pady=4, padx=5)
        self.TooMany = Label(self, text = "Less than 5 items please.")
        self.TooMany.grid_remove()
         
    def Maccas_Submit(self):
        self.Total_Maccas_num = int(self.BigMac_num.get()) + int(self.Nuggets_num.get()) + int(self.AngusBurger_num.get()) + int(self.Wraps_num.get()) + int(self.SoftServe_num.get()) + int(self.Fillet_o_Fish_num.get()) + int(self.HappyMeal_num.get()) + int(self.Salad_num.get()) + int(self.Sprite_num.get()) + int(self.Frozen_Coke_num.get()) + int(self.Apple_Pie_num.get()) + int(self.Apple_Slices_num.get())
        if int(self.Total_Maccas_num) > 5:
            self.TooMany.grid(row=20, column=1)
        else:
            self.Total_Maccas_num(row=20, column=1)
            
             
            
    def check(self):    
        if self.delivery.get() == True:
            self.Address.configure(state='normal')
            self.Phone_Number.configure(state='normal')
        else:
            self.Address.configure(state='disabled')
            self.Phone_Number.configure(state='disabled')
    def show_entry_fields(self):
        global cost
        print("\n Name: {}\n Address: {}\n Phone Number: {}" .format(self.Name.get(), self.Address.get(), self.Phone_Number.get()))
        print(self.delivery.get())
        if self.delivery.get() == True:
            cost += 3
        print(cost)


root = Tk()

root.geometry("400x600")

app = Window(root)

root.mainloop()

这是我感到困惑的部分,需要一些帮助。

        def Maccas_Submit(self):
        self.Total_Maccas_num = int(self.BigMac_num.get()) + int(self.Nuggets_num.get()) + int(self.AngusBurger_num.get()) + int(self.Wraps_num.get()) + int(self.SoftServe_num.get()) + int(self.Fillet_o_Fish_num.get()) + int(self.HappyMeal_num.get()) + int(self.Salad_num.get()) + int(self.Sprite_num.get()) + int(self.Frozen_Coke_num.get()) + int(self.Apple_Pie_num.get()) + int(self.Apple_Slices_num.get())
        if int(self.Total_Maccas_num) > 5:
            self.TooMany.grid(row=20, column=1)
        else:
            self.Total_Maccas_num(row=20, column=1)

如果有人可以解决这个问题,那将非常感谢。

标签: pythontkinterinteger

解决方案


在内部Maccas_Submit(),您self.Total_Maccas_num已从IntVar(initialized inside init_window()) 更改为int

    def Maccas_Submit(self):
        # below line changed self.Total_Maccas_num to 'int'
        self.Total_Maccas_num = int(self.BigMac_num.get()) + int(self.Nuggets_num.get()) + int(self.AngusBurger_num.get()) + int(self.Wraps_num.get()) + int(self.SoftServe_num.get()) + int(self.Fillet_o_Fish_num.get()) + int(self.HappyMeal_num.get()) + int(self.Salad_num.get()) + int(self.Sprite_num.get()) + int(self.Frozen_Coke_num.get()) + int(self.Apple_Pie_num.get()) + int(self.Apple_Slices_num.get())
        if int(self.Total_Maccas_num) > 5:
            self.TooMany.grid(row=20, column=1)
        else:
            # below line tries to use 'int' as a function which causes the exception
            self.Total_Maccas_num(row=20, column=1)

根据您的代码,我建议进行以下更改:

class Window(Frame):
    ...
    def init_window(self):
        ...
        self.Total_Maccas_num = IntVar()

        Button(self, text='Finish Order',fg='#27251F',bg='#DA291C', command=self.Maccas_Submit).grid(row=16, column=0, sticky=W, pady=4, padx=5)
        self.TooMany = Label(self, text = "Less than 5 items please.")
        #self.TooMany.grid_remove() # not necessary
        self.total_label = Label(self, textvariable=self.Total_Maccas_num)  # added a label for the total

    def Maccas_Submit(self):
        total = int(self.BigMac_num.get()) + int(self.Nuggets_num.get()) + int(self.AngusBurger_num.get()) + int(self.Wraps_num.get()) + int(self.SoftServe_num.get()) + int(self.Fillet_o_Fish_num.get()) + int(self.HappyMeal_num.get()) + int(self.Salad_num.get()) + int(self.Sprite_num.get()) + int(self.Frozen_Coke_num.get()) + int(self.Apple_Pie_num.get()) + int(self.Apple_Slices_num.get())
        if total > 5:
            self.total_label.grid_forget() # hide the total_label
            self.TooMany.grid(row=20, column=1) # show the warning
        else:
            self.TooMany.grid_forget() # hide the warning
            self.Total_Maccas_num.set(total) # update total_label
            self.total_label.grid(row=20, column=1) # show total_label

推荐阅读