在 Python 中使用 tkinter 创建一个小型 add/subtract 计算器?

Creating a small add/subtract calculator with tkinter in Python?

我大部分时间都是使用 tkinter GUI 工具创建程序的,但我只是看不出在单击 + 或 - 的实际位置哪里出错了。它应该获取输入字段中输入的值,并将其添加到结果标签,但它抛出一个 TypeError 说只能将 str(而不是“StringVar”)连接到 str.

import tkinter

class Calculator_GUI:

def __init__(self):
    self.mw = tkinter.Tk()
    self.mw.title("Calculator")
    
    self.top_frame = tkinter.Frame(self.mw)
    self.mid_frame = tkinter.Frame(self.mw)
    self.bottom_frame = tkinter.Frame(self.mw)
    
    self.prompt_label = tkinter.Label(self.top_frame, text = "Total: ")
    self.num_entry = tkinter.Entry(self.mid_frame, width = 15)
    
    self.add_button = tkinter.Button(self.bottom_frame, text = "+", width = 10, command = self.add)
    self.minus_button = tkinter.Button(self.bottom_frame, text = "-", width = 10, command = self.subtract)
    self.reset_button = tkinter.Button(self.bottom_frame, text = "Reset", width = 10, command = self.reset)
    self.result = tkinter.StringVar()
    self.result_label = tkinter.Label(self.top_frame, textvariable = self.result)
    
    self.prompt_label.pack(side = "left")
    self.num_entry.pack(side = "left")
    self.add_button.pack(side = "left")
    self.minus_button.pack(side = "left")
    self.reset_button.pack(side = "left")
    self.result_label.pack(side = "left")
    
    self.top_frame.pack()
    self.mid_frame.pack()
    self.bottom_frame.pack()
    
    tkinter.mainloop()
    
def add(self):
    self.result = float(self.num_entry.get() + self.result)
    
def subtract(self):
    self.result = float(self.result - self.num_entry.get())
    
def reset(self):
    self.result.set(0)
    
calc = Calculator_GUI()
    

self.result 是 StringVar 类型,StringVar.get() returns 是 str 类型,因此这个错误是有道理的。此外,由于同样的事实,您需要使用 setter 方法 set() 来设置您的结果标签。
我很快就试过了,到目前为止它只解决了一个问题:它连接字符串而不是添加它们的解析值。您需要在添加它们之前解析 str。

您需要正确设置和转换

import tkinter

class Calculator_GUI:

    def __init__(self):
        self.mw = tkinter.Tk()
        self.mw.title("Calculator")
        
        self.top_frame = tkinter.Frame(self.mw)
        self.mid_frame = tkinter.Frame(self.mw)
        self.bottom_frame = tkinter.Frame(self.mw)
        
        self.prompt_label = tkinter.Label(self.top_frame, text = "Total: ")
        self.num_entry = tkinter.Entry(self.mid_frame, width = 15)
        
        self.add_button = tkinter.Button(self.bottom_frame, text = "+", width = 10, command = self.add)
        self.minus_button = tkinter.Button(self.bottom_frame, text = "-", width = 10, command = self.subtract)
        self.reset_button = tkinter.Button(self.bottom_frame, text = "Reset", width = 10, command = self.reset)
        self.result = tkinter.StringVar()
        self.result.set('0')
        self.result_label = tkinter.Label(self.top_frame, textvariable = self.result)
        
        self.prompt_label.pack(side = "left")
        self.num_entry.pack(side = "left")
        self.add_button.pack(side = "left")
        self.minus_button.pack(side = "left")
        self.reset_button.pack(side = "left")
        self.result_label.pack(side = "left")
        
        self.top_frame.pack()
        self.mid_frame.pack()
        self.bottom_frame.pack()
        
        tkinter.mainloop()
        
    def add(self):
        self.result.set (str(float(self.num_entry.get()) + float(self.result.get())))
        
    def subtract(self):
        self.result.set (str(float(self.result.get()) - float(self.num_entry.get())))
        
    def reset(self):
        self.result.set('0')
    
calc = Calculator_GUI()

由于 self.resultStringVar,您需要使用 self.result.set(...) 来更新它的值。

另外,在进行加减运算之前,还需要将.get()返回的字符串转换为数字。

class Calculator_GUI:

    def __init__(self):
        ...
        self.num_entry = tkinter.Entry(self.mid_frame, width = 15)
        self.num_entry.insert(0, '0') # initialize to zero 
        ...

    def add(self):
        try:
            self.result.set(float(self.num_entry.get()) + float(self.result.get()))
        except ValueError as e:
            print(e)

    def subtract(self):
        try:
            self.result.set(float(self.result.get()) - float(self.num_entry.get()))
        except ValueError as e:
            print(e)

...