Tkinter计算器无法更新标签



我尝试使用tkinter制作一个简单的整数符号计算器。它有一个具有两个不同函数的类。第二个功能应该在用户按下"Enter"按钮时启动。当我运行代码时,窗口会按预期显示。但当我键入并点击"Enter"时,第二个函数无法运行,也不会更新标签。我希望它更新为"这个数字是正数。"、"这个数字为0。"或"这个数值是负数。"相反,它保持为空。

我怀疑它是否相关,但我在PyCharm Community Edition 5.0.4中制作了这个程序,并且我使用的是Python 3.5(32位)。

import tkinter
class IntegerSign:
    def __init__(self):
        self.window = tkinter.Tk()
        self.window.title("Integer Sign Calculator")
        self.window.geometry("300x150")
        self.number_frame = tkinter.Frame(self.window)
        self.solution_frame = tkinter.Frame(self.window)
        self.button_frame = tkinter.Frame(self.window)
        self.number_label = tkinter.Label(self.number_frame, text="Enter an integer:")
        self.number_entry = tkinter.Entry(self.number_frame, width=10)
        self.number_label.pack(side='left')
        self.number_entry.pack(side='left')
        self.statement = tkinter.StringVar()
        self.solution_label = tkinter.Label(self.solution_frame, textvariable=self.statement)
        self.statement = tkinter.Label(self.solution_frame, textvariable=self.statement)
        self.solution_label.pack(side='left')
        self.calc_button = tkinter.Button(self.button_frame, text='Enter', command=self.calc_answer)
        self.quit_button = tkinter.Button(self.button_frame, text='Quit', command=self.window.destroy)
        self.calc_button.pack(side='left')
        self.quit_button.pack(side='left')
        self.number_frame.pack()
        self.solution_frame.pack()
        self.button_frame.pack()
        tkinter.mainloop()
    def calc_answer(self):
        self.number = int(self.number_entry.get())
        self.statement = tkinter.StringVar()
        if self.number > 0:
            self.statement = "This number is positive."
        elif self.number == 0:
            self.statement = "This number is 0."
        else:
            self.statement = "This number is negative."
IntegerSign()

第一个问题:在构造函数中,将名为self.statement的变量初始化为StringVar,然后再次初始化为Label。在第二次初始化之后,您无法访问第一个对象。您需要使用两个不同的名称。

第二个问题:在事件处理程序calc_answer中,您创建了一个名为self.statement的新对象,但您需要将新值set转换为旧值(请参阅文档)。以下是您的程序的修改版本,可以按预期工作:

import tkinter
class IntegerSign:
    def __init__(self):
        self.window = tkinter.Tk()
        self.window.title("Integer Sign Calculator")
        self.window.geometry("300x150")
        self.number_frame = tkinter.Frame(self.window)
        self.solution_frame = tkinter.Frame(self.window)
        self.button_frame = tkinter.Frame(self.window)
        self.number_label = tkinter.Label(self.number_frame, text="Enter an integer:")
        self.number_entry = tkinter.Entry(self.number_frame, width=10)
        self.number_label.pack(side='left')
        self.number_entry.pack(side='left')
        self.solution_string = tkinter.StringVar()
        self.solution_label = tkinter.Label(self.solution_frame, textvariable=self.solution_string)
        self.statement = tkinter.Label(self.solution_frame, textvariable=self.solution_string)
        self.solution_label.pack(side='left')
        self.calc_button = tkinter.Button(self.button_frame, text='Enter', command=self.calc_answer)
        self.quit_button = tkinter.Button(self.button_frame, text='Quit', command=self.window.destroy)
        self.calc_button.pack(side='left')
        self.quit_button.pack(side='left')
        self.number_frame.pack()
        self.solution_frame.pack()
        self.button_frame.pack()
        tkinter.mainloop()
    def calc_answer(self):
        self.number = int(self.number_entry.get())
        if self.number > 0:
            self.solution_string.set("This number is positive.")
        elif self.number == 0:
            self.solution_string.set("This number is 0.")
        else:
            self.solution_string.set("This number is negative.")
IntegerSign()

此代码有效,但包含一个我建议您修复的错误做法。函数tkinter.mainloop()本质上是一个无限循环,您已经将它放置在构造函数中。因此,构造函数不会以构造函数通常应该的方式返回。从__init__函数中取出该语句,并将其放在调用IntegerSign之后的末尾,使其成为将来使用的模式。

要设置StringVar的值,需要使用set方法。现在你所做的只是重新分配变量。您还可以通过在第一次初始化字符串时给它一个值来设置字符串的(默认)值。例如-var = tk.StringVar(value="some value")

编辑:没看到你也把self.statement设置为标签小部件。。。如果您在这个答案的底部一直使用该方法,并且完全忽略(可选)stringvar的方法,这将起作用。但是,当你这样做的时候,你可以把它看作是一张便签。你贴了一张便签,上面写着"这个变量保持这个值",然后你重新分配了这个变量,在上一个便签上再贴一张便贴,上面写"它现在保持这个值了",这是一个非常松散的视觉类比。

>>> import tkinter as tk
>>> root = tk.Tk()
>>> statement = tk.StringVar()
>>> type(statement)
>>> <class 'tkinter.StringVar'>
>>> statement = "This number is positive"
>>> type(statement)
>>> <class 'str'>
>>> statement = tk.StringVar()
>>> statement.set("This number is positive")
>>> statement.get()
'This number is positive'
>>> type(statement)
>>> <class 'tkinter.StringVar'>

或者,您可以通过执行label_widget['text'] = 'new_text' 来更改标签文本

相关内容

  • 没有找到相关文章

最新更新