消息框 tkinter 的问题

Issue with messagebox tkinter

基本上我的问题是 self.asses_val 按钮小部件。按钮被自动按下。我有一个 try/except 语句来防止它崩溃。

为什么在将任何值输入到条目小部件之前,消息框会自动 运行?

如果我没有 try/except 语句,我会得到这个错误:

val = float(self.property_value_entry.get()) ValueError: could not convert string to float:

我将此解释为条目小部件的值没有机会获得数字输入并最终返回空白的“”字符串输入,因为没有输入任何内容!!!怎么回事?

import tkinter
import tkinter.messagebox


class taxGUI:
    def __init__(self):
        self.main_window = tkinter.Tk()

        # initialize frames
        self.top_frame = tkinter.Frame(self.main_window)
        self.mid_frame = tkinter.Frame(self.main_window)

        # top frame widgets
        self.property_value = tkinter.Label(self.top_frame, text='Enter Property Value')
        self.property_value_entry = tkinter.Entry(self.top_frame, width=10)

        # pack top_frame widgets
        self.property_value.pack(side='left')
        self.property_value_entry.pack(side='right')

        # mid frame widgets
        self.asses_val = tkinter.Button(self.mid_frame, text='Assesment Value', command=self.getAssessment())
        self.tax_val = tkinter.Button(self.mid_frame, text='Tax Value')
        self.quit = tkinter.Button(self.mid_frame, text='Quit', command=self.main_window.destroy)

        # pack mid frame widgets
        self.asses_val.pack(side='left')
        self.tax_val.pack(side='left')
        self.quit.pack(side='right')

        # pack frames
        self.top_frame.pack()
        self.mid_frame.pack()


        tkinter.mainloop()

    def getAssessment(self):
        try:
            val = float(self.property_value_entry.get())
        except ValueError:
            val = 0.00
        assessment = val * 0.60
        tkinter.messagebox.showinfo('The property value is assessed at ' + str(assessment) + ' dollars.')

    def getTaxes(self):
        val = float(self.property_value_entry.get())
        tax = val * 0.75
        tkinter.messagebox.showinfo('The tax on this property is ' + str(tax) + ' dollars.')


# instantiate GUI
t = taxGUI()

self.asses_val 中的第 22 行,将 command=self.getAssessment() 更改为 command=self.getAssessment 即可。

代码将变为:

import tkinter
import tkinter.messagebox


class taxGUI:
    def __init__(self):
        self.main_window = tkinter.Tk()

        # initialize frames
        self.top_frame = tkinter.Frame(self.main_window)
        self.mid_frame = tkinter.Frame(self.main_window)

        # top frame widgets
        self.property_value = tkinter.Label(self.top_frame, text='Enter Property Value')
        self.property_value_entry = tkinter.Entry(self.top_frame, width=10)

        # pack top_frame widgets
        self.property_value.pack(side='left')
        self.property_value_entry.pack(side='right')

        # mid frame widgets
        self.asses_val = tkinter.Button(self.mid_frame, text='Assesment Value', command=self.getAssessment)
        # _______________________________________________________________________________________________^
        self.tax_val = tkinter.Button(self.mid_frame, text='Tax Value', command=self.getTaxes)
        self.quit = tkinter.Button(self.mid_frame, text='Quit', command=self.main_window.destroy)

        # pack mid frame widgets
        self.asses_val.pack(side='left')
        self.tax_val.pack(side='left')
        self.quit.pack(side='right')

        # pack frames
        self.top_frame.pack()
        self.mid_frame.pack()


        tkinter.mainloop()

    def getTaxes(self):
        val = float(self.property_value_entry.get())
        tax = val * 0.75
        tkinter.messagebox.showinfo('The tax on this property is ' + str(tax) + ' dollars.')

    def getAssessment(self):
        val = float(self.property_value_entry.get())
        assessment = val * 0.60
        tkinter.messagebox.showinfo('The property value is assessed at ' + str(assessment) + ' dollars.')


# instantiate GUI
t = taxGUI()