如何在方法中调用金额

use*_*540 0 python methods tkinter

# Tip Calculator
from tkinter import *

class TipCalc:
    def __init__(self):
        my_window = Tk() # create a window
        my_window.title("Tip Calculator")
        my_window.geometry('400x200')

        amount = StringVar()

        # create frames labels, entry, and buttons
        frm_upper = Frame(my_window)
        frm_upper.pack()
        frm_mid = Frame(my_window)
        frm_mid.pack()
        frm_lower = Frame(my_window)
        frm_lower.pack()

        # create label and entry for amount
        amount_label = Label(frm_upper, text = "Enter Amount: ")
        my_entry = Entry(frm_upper, textvariable = amount)
        my_entry.delete(0, END)
        my_entry.insert(0, "")

        # create a label for total amount
        total_label = Label(frm_mid, text = "")

        # create buttons in lower frame
        btn_10_perc = Button(frm_lower, text = "10%", command = self.calculate_10_perc)
        btn_15_perc = Button(frm_lower, text = "15%", command = self.calculate_15_perc)
        btn_18_perc = Button(frm_lower, text = "18%", command = self.calculate_18_perc)
        btn_20_perc = Button(frm_lower, text = "20%", command = self.calculate_20_perc)

        amount_label. grid(row = 1, column = 1)
        my_entry.    grid(row = 1, column = 2)
        btn_10_perc. grid(row = 3, column = 1)
        btn_15_perc. grid(row = 3, column = 2)
        btn_18_perc. grid(row = 3, column = 3)
        btn_20_perc. grid(row = 3, column = 4)

        my_window.mainloop()

    def calculate_10_perc(self):
        bill = float(self.amount.get())
        total = bill*1.10
        total_result = Label(frm_mid, "Total after tip added: %.2f" % total).grid(row=2, column =1)
        return

    def calculate_15_perc(self):
        pass

    def calculate_18_perc(self):
        pass

    def calculate_20_perc(self):
        pass


########################### Main Program ###############################
TipCalc() # anonymous instance of the class
Run Code Online (Sandbox Code Playgroud)

如何将实例中的金额调用到方法中,以便我可以用它来计算?我收到一个错误,

AttributeError:'TipCalc'对象没有属性'amount'

tob*_*s_k 6

你必须绑定amountself,即

amount = StringVar()
Run Code Online (Sandbox Code Playgroud)

应该

self.amount = StringVar()
Run Code Online (Sandbox Code Playgroud)

因此,您还必须更改my_entry = Entry(frm_upper, textvariable=amount)my_entry = Entry(frm_upper, textvariable=self.amount)

否则,self.amount在您bill = float(self.amount.get())进入时未定义calculate_10_perc.


另外,请注意做

total_result = Label(...).grid(row=2, column=1)
Run Code Online (Sandbox Code Playgroud)

total_result不是Label,但结果grid,即None

每次更新total值时,您似乎都在(尝试)创建新标签.相反,您应该configure使用现有标签来保存新值.在__init__:

self.total_label = Label(frm_mid, text="")
self.total_label.pack()
Run Code Online (Sandbox Code Playgroud)

并在calculate_10_perc:

self.total_label.configure(text="Total after tip added: %.2f" % total)
Run Code Online (Sandbox Code Playgroud)

最后,鉴于所有这些calculate_X_perc函数可能看起来非常相似,您可以将其作为一个函数并将百分比作为参数传递,例如__init__:

btn_10_perc = Button(frm_lower, text = "10%", command=lambda: self.calculate_perc(1.1))
Run Code Online (Sandbox Code Playgroud)

功能:

def calculate_perc(self, percent):
    bill = float(self.amount.get())
    self.total_label.configure(text="Total after tip added: %.2f" % (bill * percent))
Run Code Online (Sandbox Code Playgroud)