首页 > 解决方案 > 在 Python 中使用 tkinter 创建一个小型加/减计算器?

问题描述

在大多数情况下,我使用 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()
    

标签: pythonuser-interfacetkinter

解决方案


由于self.result是 a StringVar,因此您需要使用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)

...

推荐阅读