在我的计算器python tkinter GUI

时间:2016-07-09 09:19:54

标签: python user-interface tkinter clear backspace

我是python的新手,我想修复" C"按钮,以便清除显示屏上的最后一个数字。例如321会变成32,我已经尝试了很多东西,但我似乎无法让它工作,如果有人能让它工作,我将非常感激,谢谢。这是代码:

from tkinter import *


class Calc():
    def __init__(self):
        self.total = 0
        self.current = ""
        self.new_num = True
        self.op_pending = False
        self.op = ""
        self.eq = False


    def num_press(self, num):
        self.eq = False
        temp = text_box.get()
        temp2 = str(num)      
        if self.new_num:
            self.current = temp2
            self.new_num = False
        else:
            if temp2 == '.':
                if temp2 in temp:
                    return
            self.current = temp + temp2
        self.display(self.current)

    def calc_total(self):
        self.eq = True
        self.current = float(self.current)
        if self.op_pending == True:
            self.do_sum()
        else:
            self.total = float(text_box.get())

    def display(self, value):
        text_box.delete(0, END)
        text_box.insert(0, value)

    def do_sum(self):
        if self.op == "add":
            self.total += self.current
        if self.op == "minus":
            self.total -= self.current
        if self.op == "times":
            self.total *= self.current
        if self.op == "divide":
            self.total /= self.current
        self.new_num = True
        self.op_pending = False
        self.display(self.total)

    def operation(self, op): 
        self.current = float(self.current)
        if self.op_pending:
            self.do_sum()
        elif not self.eq:
            self.total = self.current
        self.new_num = True
        self.op_pending = True
        self.op = op
        self.eq = False

    def cancel(self):
        self.eq = False
        self.current = "0"
        self.display(0)
        self.new_num = True

    def all_cancel(self):
        self.cancel()
        self.total = 0

    def sign(self):
        self.eq = False
        self.current = -(float(text_box.get()))
        self.display(self.current)

sum1 = Calc()
root = Tk()
calc = Frame(root)
calc.grid()

root.title("Calculator")
text_box = Entry(calc, justify=RIGHT)
text_box.grid(row = 0, column = 0, columnspan = 3, pady = 5)
text_box.insert(0, "0")

numbers = "789456123"
i = 0
bttn = []
for j in range(1,4):
    for k in range(3):
        bttn.append(Button(calc, text = numbers[i]))
        bttn[i].grid(row = j, column = k, pady = 5)
        bttn[i]["command"] = lambda x = numbers[i]: sum1.num_press(x)
        i += 1

bttn_0 = Button(calc, text = "0")
bttn_0["command"] = lambda: sum1.num_press(0)
bttn_0.grid(row = 4, column = 1, pady = 5)

bttn_div = Button(calc, text = chr(247))
bttn_div["command"] = lambda: sum1.operation("divide")
bttn_div.grid(row = 1, column = 3, pady = 5)

bttn_mult = Button(calc, text = "x")
bttn_mult["command"] = lambda: sum1.operation("times")
bttn_mult.grid(row = 2, column = 3, pady = 5)

minus = Button(calc, text = "-")
minus["command"] = lambda: sum1.operation("minus")
minus.grid(row = 3, column = 3, pady = 5)

point = Button(calc, text = ".")
point["command"] = lambda: sum1.num_press(".")
point.grid(row = 4, column = 0, pady = 5)

add = Button(calc, text = "+")
add["command"] = lambda: sum1.operation("add")
add.grid(row = 4, column = 3, pady = 5)

neg= Button(calc, text = "+/-")
neg["command"] = sum1.sign
neg.grid(row = 5, column = 0, pady = 5)

clear = Button(calc, text = "C")
clear["command"] = sum1.cancel
clear.grid(row = 5, column = 1, pady = 5)

all_clear = Button(calc, text = "AC")
all_clear["command"] = sum1.all_cancel
all_clear.grid(row = 5, column = 2, pady = 5)

equals = Button(calc, text = "=")
equals["command"] = sum1.calc_total
equals.grid(row = 5, column = 3, pady = 5)

root.mainloop()

3 个答案:

答案 0 :(得分:3)

对于退格键,你只需删除数组中的最后一个字符,对吗? 如果是这样,以下功能应该可以正常工作

def backspace(self):
  self.current = self.current[0:len(self.current) -1]
  if self.current == "":
     self.new_num = True
     self.current = "0"
  self.dsiplay(self.current)

0是不必要的,可以省略。更简单的方法是:

def backspace(self):
   self.current = self.current[:-1]
   if self.current == "":
      self.new_num = True
      self.current = "0"
   self.display(self.current)

答案 1 :(得分:2)

添加新按钮 -

back = Button(calc, text = "B")
back["command"] = sum1.backspace
back.grid(row = 4, column = 2, pady = 5)

并定义一个这样的函数 -

def backspace(self):
#check if all has been removed
#make sure you import the re module
    if re.match(r'\d$', self.current):
        self.display(0)
        self.new_num = True
    else:
        self.current = self.current[:-1]    
        self.display(self.current)

答案 2 :(得分:1)

使用variable class对您的情况非常方便,因为它允许您通过设置此变量的内容来更新text_box的文本。请注意,除了我在下面提到的内容之外,您不必更改代码中的任何其他内容:

var = StringVar() # Add this line
text_box = Entry(calc, justify=RIGHT, textvariable=var) # Modification here
text_box.grid(row = 0, column = 0, columnspan = 3, pady = 5)
var.set(0) # When you lunch the GUI, you will get 0 in text_box
#text_box.insert(0, "0") <-- You do not need this line

现在您需要更改代码cancel(),如下所示:

def cancel(self):
    global var
    self.eq = False
    self.current = self.current[:-1] # Remove last digit
    if self.current: # If there is at list one digit
       var.set(self.current)
    else: # In this case display 0 in text_box
       var.set(0)
    self.new_num = True

与其他提及的答案不同,您需要删除self.display(0)中的cancel()

<强>演示:

让我们输入123并逐个删除所有数字:

enter image description here

删除3:

enter image description here

删除2:

enter image description here

删除1(这里是上面if ... else条件有用的地方):

enter image description here