如何被点击的Tkinter后按钮更改标签的价值(how to change value of lab

2019-10-29 21:50发布

我创建一个简单的银行帐户GUI,当我点击菜单中的“利益”的变量从1改为2,这应该由10%改变当前余额的数值,但是值保持不变,给你的洞察力。

from tkinter import *
from random import randint


class BankAccount(object):
    def __init__(self, initial_balance=0):
        self.balance = initial_balance
    def deposit(self, amount):
        self.balance += amount
    def withdraw(self, amount):
        self.balance -= amount       
    def get_balance(self, initial_balance, rate):
        return self.get_balance() * self._rate

class BankAccountWithInterest(BankAccount):
    def __init__(self, initial_balance=0, rate=0.1):
        BankAccount.__init__(self, initial_balance)
        self._rate = rate           
    def interest(self):
        return self.balance * self._rate

balance = (randint(100, 500))
my_account = BankAccount(balance)
my_interest = BankAccountWithInterest(balance)
interest = my_interest.balance + my_interest.interest()

typeOfAccount = "1"
class GUI:
    def __init__(self, master):
        frame = Frame(master)
        frame.pack()


        #Toolbar#

        toolbar = Frame(root)
        toolbar.pack(side=TOP, fill=X)

        #Button#

        button1 = Button(toolbar, text="Deposit", width = 13,    command=self.depositBalance)
        button2 = Button(toolbar, text="Withdraw",width = 13, command=self.depositWithdraw)
        button1.pack(side=LEFT)
        button2.pack(side=RIGHT)

        #Menu#

        subMenu = Menu(menu)
        menu.add_cascade(label="Type of Account", menu=subMenu)
        subMenu.add_command(label="Standard", command= self.standard)
        subMenu.add_command(label="Interest", command= self.interest)

        #Textbox#

        self.text = Entry(root)
        self.text.pack()

        #Labels#

        w = Label(root, text="Current Balance:")
        w.pack()
        w1 = tkinter.StringVar()
        if typeOfAccount == "1":
            w1 = Label(root, text=my_account.balance)
            w1.pack()
        elif typeOfAccount == "2":
            w1.set(text=interest)
            w1.pack()


    def depositBalance(self):
            a = int(self.text.get())
            my_account.balance = a + my_account.balance
            print(my_account.balance)

    def depositWithdraw(self):
            a = int(self.text.get())
            my_account.balance = my_account.balance - a
            print(my_account.balance)         

    def standard(self):
        typeOfAccount = "1"

    def interest(self):
        typeOfAccount = "2"


root = Tk()
menu = Menu(root)
root.config(menu=menu)
root.title("Bank Account")
root.minsize(width=250, height=100)
root.maxsize(width=300, height=150)
GUI(root)

root.mainloop()

Answer 1:

有几个问题与您的代码。 多类文件不会出现,你认为他们应该有的事情是错的工作。 我已经重新设计你的程序成什么样,我认为这是你正在尝试做的,我已经搬到一切都变成1个大课,因为它在这种情况下,更有意义。 你只会使事情复杂得多,它需要的是通过创建类之外的变量,并通过使几类。 有没有什么错误使用几类,但你要了解它的方式是做事情的方式更加困难比它需要的是。

我所做的第一件事情就是创建所有类变量/属性,我们要使用。

为了让事情对我们更容易前进我通过将尽一切部件和可变类属性self. 作为前缀的所有变量/部件名称。 这将允许我们进行交互,并更改任何类方法每个属性没有问题,如果你添加更多的选择的道路的属性就已经被定义并准备改变。

接下来,我感动了所有的单独的类方法进入主类,以使事情更容易使用。

我换成你的if / else语句的帐户类型为方法。 这将允许我们更新标签,以显示余额或利息的帐户类型或改变的量添加或从天平上取走的任何时间。

我修改了depositBalancedepositWithdraw methodsto有一点点的错误处理,因为你的输入域不仅限于数字,如果用户将任何东西或留下空白可能会导致错误。

我改变standardinterest的方法来更新typeOfAccount属性,并通过调用来更新标签type_account方法。

最后但并非最不重要一些通用的清理,使代码没有无谓的间距,并确保我们遵循DRY(不要重复自己)的标准。

下面是我在上面提到的所有更改返工代码。 让我知道如果这能帮助,如果你是在什么困惑。

from tkinter import *
from random import randint

class GUI:
    def __init__(self, master):

        self.master = master
        self.typeOfAccount = "1"
        self.balance = (randint(100, 500))
        self.rate = 0.1

        self.frame = Frame(master)
        self.frame.pack()

        self.toolbar = Frame(root)
        self.toolbar.pack(side=TOP, fill=X)

        self.button1 = Button(self.toolbar, text="Deposit", width = 13, command=self.depositBalance)
        self.button2 = Button(self.toolbar, text="Withdraw",width = 13, command=self.depositWithdraw)
        self.button1.pack(side=LEFT)
        self.button2.pack(side=RIGHT)

        self.menu = Menu(self.master)
        self.master.config(menu = self.menu)
        self.subMenu = Menu(self.menu)
        self.menu.add_cascade(label="Type of Account", menu=self.subMenu)
        self.subMenu.add_command(label="Standard", command=self.standard)
        self.subMenu.add_command(label="Interest", command=self.interest)

        self.text = Entry(self.master)
        self.text.pack()

        self.w = Label(root, text="Current Balance: {}".format(self.balance))
        self.w.pack()
        #removed "tkinter." not needed because of the type of import you used
        self.w1 = StringVar()

    def type_account(self):
        if self.typeOfAccount == "1":
            self.w.config(text="Current Balance: {}".format(self.balance))

        elif self.typeOfAccount == "2":
            interest = self.balance * self.rate
            self.w.config(text="Current Balance: {}".format(interest))

    def depositBalance(self):
        try:
            if int(self.text.get()) > 0:
                a = int(self.text.get())
                self.balance = a + self.balance
                self.type_account()
        except:
            print("Blank or non numbers in entry field")

    def depositWithdraw(self):
        try:
            if int(self.text.get()) > 0:
                a = int(self.text.get())
                self.balance = self.balance - a
                self.type_account()
        except:
            print("Blank or non numbers in entry field")

    def standard(self):
        self.typeOfAccount = "1"
        self.type_account()

    def interest(self):
        self.typeOfAccount = "2"
        self.type_account()

if __name__ == "__main__":

    root = Tk()
    root.title("Bank Account")
    root.minsize(width=250, height=100)
    root.maxsize(width=300, height=150)

    app = GUI(root)

    root.mainloop()


Answer 2:

你应该设置self.w1 ,(而不仅仅是w1 )例如,那么你可以从更新在类中的任何实例方法的文本。



文章来源: how to change value of label after button is clicked on Tkinter