占位符不在Tkinter App中工作

时间:2017-07-20 15:46:03

标签: python python-3.x tkinter

我在此代码中制作占位符时遇到问题,当我在单独的窗口中按照以前的帖子进行操作时,它可以正常工作,但是当我尝试将该代码调整到我的代码中时,它不起作用。它只留下一个没有占位符的空白文本框。请提供您的见解。

from tkinter import *
from random import randint
import time

class Account:
    def __init__(self, init_balance=0):
        self.balance = init_balance
    def deposit(self, amount):
        self.balance += amount
    def withdraw(self, amount):
        self.balance -= amount
    def get_balance(self):
        return self.balance

class InterestAccount(Account):
    def __init__(self, init_balance=0, rate=0.1):
        super().__init__(init_balance)
        self._rate = rate
    def interest(self):
        return self.balance * self._rate   
    def deposit(self, amount):
        interest += amount
    def withdraw(self, amount):
        interest -= amount


class GUI(Tk):
    def __init__(self):
        Tk.__init__(self)
        self.title('Bank Account')


        #Menu#
        menu = Menu(self)
        acct_type_menu = Menu(menu)
        menu.add_cascade(label='Account Type', menu=acct_type_menu)
        acct_type_menu.add_command(label='Standard', command=self.set_type_standard)
        acct_type_menu.add_command(label='Interest', command=self.set_type_interest)
        self.config(menu=menu)

        #Account#
        start_balance = randint(100, 500)
        self.acct = Account(start_balance)
        self.my_interest = InterestAccount(start_balance)
        self.interest = self.my_interest.balance + self.my_interest.interest()

        #Labels#
        Label(self, text='Current Balance:').pack()
        self.balance_label = Label(self, text='Select account type')
        self.balance_label.pack()

        #Button#
        btns_frame = Frame(self)
        btns_frame.pack(side=TOP, fill=X)

        Button(btns_frame, text='Deposit', width=13, command=self.deposit).pack(side=LEFT)
        Button(btns_frame, text='Withdraw', width=13, command=self.withdraw).pack(side=RIGHT)
-----------------------------------------------> HIGHLIGHTED  
        #Textbox#

        vcmd = (self.register(self.onValidate), '%S')
        self.text = Entry(self, validate='key', vcmd=vcmd)
        self.text.pack()
        self.text.pack()
        placeholder_text = 'some text'
        self.text.insert(0, placehoder_text)
        self.text.bind("<Button-1>", lambda event: clear_entry(self))

    def clear_entry(self):
        self.text.delete(0, END)
        self.text.pack()

    def onValidate(self, S):
        if S in '0123456789.':
            return True
        return False
---------------------------------------------> HIGHLIGHTED 


    def set_type_standard(self):
        self.acct_type = 'standard'
        self.balance_label.config(text=round(self.acct.balance, 2))

    def set_type_interest(self):
        self.acct_type = 'interest'
        self.balance_label.config(text=round(self.interest, 2))

    def deposit(self): 
        if self.acct_type == 'interest':
            a = int(self.text.get())
            self.interest += a
            self.balance_label.config(text=round(self.interest, 2))
        elif self.acct_type == 'standard':
            a = int(self.text.get())
            self.acct.balance += a
            self.balance_label.config(text=round(self.acct.balance, 2))
        else:
            self.balance_label.config(text='Select account type')
            self.clear_entry()

    def withdraw(self):
        if self.acct_type == 'interest':
            a = int(self.text.get())
            self.interest -= a
            self.balance_label.config(text=round(self.interest, 2))
        elif self.acct_type == 'standard':
            a = int(self.text.get())
            self.acct.balance -= a
            self.balance_label.config(text=round(self.acct.balance, 2))
        else:
            self.balance_label.config(text='Select account type')
            self.clear_entry()


if __name__ == '__main__':
    GUI().mainloop()

1 个答案:

答案 0 :(得分:0)

正如我在您的问题评论中提到的,您的代码中还有其他一些问题,但这个答案将重点关注占位符不起作用的原因。

self.text条目小部件中的验证参数阻止除了放置数字之外的任何内容。所以这就是你的placeholder_text无效的原因。

您可以更改占位符,使其值为0"0"。或者删除验证=&#39;键&#39;一部分。

BTW您的占位符文字中存在拼写错误。

变化:

self.text.insert(0, placehoder_text)

为:

self.text.insert(0, placeholder_text)

更新:

根据您的要求,我在您的代码中添加了一些需要您注意的问题。

在班级InterestAccount(Account):

    # Both the below methods don't do anything of use.
    # The variable (interest) is a local variable in this case and needs
    # to be assigned a value before you can add to or subtract from it.
    # In the Eclipse IDE at least the code wont even run
    # until these 2 methods have been fixed.
    def deposit(self, amount):
        interest += amount
    def withdraw(self, amount):
        interest -= amount

在班级GUI(Tk):

        # Here you are using the argument validate='key'.
        # This is not a big deal but will prevent the 
        # insert(0, placeholder_text) from working because
        # the value of placeholder_text is not a number.
        self.text = Entry(self, validate='key', vcmd=vcmd)

        # you have packed the self.text widget twice here.
        # just remove one of the packs as it is not needed.
        self.text.pack()
        self.text.pack()
        placeholder_text = 'some text'

        # There is a typo here for placehoder_text.
        # Change it to placeholder_text.
        self.text.insert(0, placehoder_text)

        # Because you are calling a method of a class the clear_entry(self)
        # needs to be changed to self.clear_entry() instead. 
        self.text.bind("<Button-1>", lambda event: clear_entry(self))

        # There is no reason to pack the text box here as it is already packed
        # just delete the self.text.pack() here.
    def clear_entry(self):
        self.text.delete(0, END)
        self.text.pack()