【问题标题】:Calculator program returns tkinter error in python计算器程序在 python 中返回 tkinter 错误
【发布时间】:2019-12-05 23:06:49
【问题描述】:

我正在尝试为计算器编写一个界面非常简单的程序。我仍然需要向它添加一些功能,但是,到目前为止,我测试了我的代码并且我得到了一个非常奇怪的 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()

【问题讨论】:

  • .grid() 方法返回None。你应该做的是E1= Entry(top, bd=5) 然后E1.grid(row=1,column=1) 让我知道这是否有帮助
  • @LazyCoder 是的,非常感谢。解释是 Entry.grid 只是在构建接口,而 Entry 也在返回一些东西?那么当我使用 entry.grid 时,你有什么想法吗?
  • @LazyCoder 好的,非常感谢。祝你有美好的一天!
  • Entry 创建一个对象。而 grid 调用一个返回 None 的方法。您需要 E1 的对象引用。就是这样。

标签: python tkinter calculator


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      问题

      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()
      

      【讨论】:

        猜你喜欢
        • 2013-04-29
        • 2011-05-05
        • 2016-08-26
        • 1970-01-01
        • 2020-03-18
        • 1970-01-01
        • 2016-12-09
        • 2015-09-25
        • 1970-01-01
        相关资源
        最近更新 更多