计算器程序在python中返回tkinter错误

时间:2019-07-28 09:57:58

标签: python tkinter calculator

我正在尝试编写一个非常简单的计算器接口程序。我仍然必须向其中添加一些功能,但是,到目前为止,我已经测试了我的代码,并且收到了一个非常奇怪的tkinter错误。你能给我解释一下是什么问题吗? 这是错误:

Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python3.6/tkinter/__init__.py", line 1705, in __call__
    return self.func(*args)
  File "/home/user/PycharmProjects/application /App1.py", line 8, in process
    number1 = Entry.get(E1)
  File "/usr/lib/python3.6/tkinter/__init__.py", line 2682, in get
    return self.tk.call(self._w, 'get')
AttributeError: 'NoneType' object has no attribute 'tk'

这是我的代码:

from tkinter import *
import tkinter
import tkinter.messagebox

def process():
    try :
        number1 = Entry.get(E1)
        number2 = Entry.get(E2)
        operator = Entry.get(E3)
        number1 = int (number1)
        number2 = int ( number2)
        if operator == "+" :
            answer = number1 + number2
        Entry.insert(E4,0,answer)
        print(answer)
    except ValueError:
        tkMessageBox.showwarning("Warning", "Please enter the value in integer")

top = tkinter.Tk()


L1  = Label(top, text ='My calculator',).grid(row = 0 , column = 1)
L2 = Label (top, text = "Number 1",).grid(row = 1 , column = 0)
L3 = Label (top, text = 'Number 2',).grid (row = 2, column = 0)
L4 = Label (top, text = 'Operator',) . grid (row=3, column = 0)
L5 = Label (top, text = 'Answer:',) . grid ( row = 4, column = 0)
E1 = Entry (top, bd = 5,).grid( row = 1 , column = 1)
# OR : E1.grid(row = 1, column = 1)
E2 = Entry ( top , bd = 5,).grid( row = 2, column = 1)
E3 = Entry ( top, bd = 5,).grid(row = 3, column = 1)
E4 = Entry ( top, bd = 5,).grid(row=4, column= 1 )
B = Button(top, text = "Submit here: ", command = process).grid (row = 5 , column = 1,)


top.mainloop()

3 个答案:

答案 0 :(得分:1)

您确定jtc是正确的,即Entry.get(...)是静态/类方法,还是应该创建get的实例并在其上调用Entry那?

答案 1 :(得分:1)

.grid()方法返回None。您应该做的是先E1= Entry(top, bd=5),然后E1.grid(row=1,column=1),错误会自行解决。

答案 2 :(得分:0)

问题

  1. .grid()方法返回None,因此您正在将None分配给变量。您应该将它们分为两行,例如:

    代替:

    E1 = Entry (top, bd = 5,).grid( row = 1 , column = 1)
    

    使用:

    E1 = Entry(top, bd = 5,)
    E1.grid( row = 1 , column = 1)
    
  2. 使用from tkinter import messagebox代替import tkinter.messagebox

最小工作代码

下面应该是更改最少的工作代码

from tkinter import *
import tkinter
from tkinter import messagebox


def process():
    try :
        number1 = Entry.get(E1)
        number2 = Entry.get(E2)
        operator = Entry.get(E3)
        number1 = int(number1)
        number2 = int(number2)
        if operator == "+" :
            answer = number1 + number2
        Entry.insert(E4,0,answer)
        print(answer)
    except ValueError:
        messagebox.showwarning("Warning", "Please enter the value in integer")

top = tkinter.Tk()


L1 = Label(top, text ='My calculator',)
L1.grid(row = 0 , column = 1)

L2 = Label(top, text = "Number 1",)
L2.grid(row = 1 , column = 0)

L3 = Label(top, text = 'Number 2',)
L3.grid(row = 2, column = 0)

L4 = Label(top, text = 'Operator',)
L4.grid(row=3, column = 0)

L5 = Label(top, text = 'Answer:',)
L5.grid( row = 4, column = 0)

E1 = Entry(top, bd = 5,)
E1.grid( row = 1 , column = 1)

E2 = Entry( top , bd = 5,)
E2.grid( row = 2, column = 1)

E3 = Entry( top, bd = 5,)
E3.grid(row = 3, column = 1)

E4 = Entry( top, bd = 5,)
E4.grid(row=4, column= 1 )

B = Button(top, text = "Submit here: ", command = process)
B.grid(row = 5 , column = 1,)


top.mainloop()