Python在GUI中发布从功能到输入框的回答

时间:2014-11-14 17:32:08

标签: python-3.x

我试图从Python 3.4中的一个输入框中简单地添加一个答案,但不断收到以下错误。 Tkinter回调中的例外

Traceback (most recent call last):
  File "C:\Python34\lib\tkinter\__init__.py", line 1533, in __call__
    return self.func(*args)
  File "H:\guitest.py", line 12, in calculate
    enter3.configure(text=answer)
AttributeError: 'NoneType' object has no attribute 'configure'


#Imports The Default Graphical Library
import tkinter
from tkinter import *

#Addition Function
def calculate():
    """ take the two numbers entered and process them """
    firstnum=int(number1.get())

    secondnum=int(number2.get())
    answer=firstnum+secondnum
    enter3.configure(text=answer)
    return


#Creates Graphical Window
window = Tk()
# Assigns a Name To the Graphical Window
window.title("MY GUI")
# Set the Graphical Window Size
window.geometry("500x200")

number1=StringVar()
number2=StringVar()

label1 = Label(text='1st Number').place(x=50,y=30)
label2 = Label(text='2nd Number').place(x=150,y=30)
label3 = Label(text='ANSWER').place(x=100,y=80)
enter1 =Entry(width=10,textvariable=number1).place(x=50,y=50)
enter2 =Entry(width=10,textvariable=number2).place(x=150,y=50)
enter3 =Entry(width=10).place(x=100,y=100)



#Creates Button
w = Button(text='ADD',bd=10,command=calculate).place(x=100,y=150)

#Executes the above Code to Create the Graphical Window
window.mainloop()

1 个答案:

答案 0 :(得分:0)

这里至少有三个问题。

  1. 应该持有UI元素的变量(例如label1entry3)实际上并不持有它们。它们设置为Noneplace方法未返回正在放置的对象。它只是做放置。因此,您需要将初始化策略更改为:

    enter3 = Entry(width=10)
    enter3.place(x=100,y=100)
    

    如果你认为非流畅的风格不那么优雅,我同意......但显然place不会返回对象,所以你不能做 en passant 创作和安置。

  2. entry3.configure(text=answer)不起作用,因为answer不是字符串。这是一个整数。您需要entry3.configure(text=str(answer))。至少。

  3. 我撒了谎。这也不会起作用,因为configure不是通常设置Entry小部件文本的方式。请尝试改为:

    entry3.delete(0, END) # delete whatever's there already
    entry3.insert(0, str(answer))
    entry3.update() # make sure update is flushed / immediately visible
    

    参见例如有关Entry个对象的更多信息,请this tutorial。虽然明确的widget.update()电话看起来很笨拙,但请相信我 - 当事情没有像您认为的那样更新时,它们会变得非常方便。

  4. 我不确定你为什么要使用混合策略。对于输入,您使用StringVar个对象,但随后转移到答案小部件的原始更新。并不是说它不起作用......但是设置number3 = StringVar()并将其作为textvariable的{​​{1}},然后entry3添加可能会更容易更新它。选择你的毒药。

  5. 即使您进行了这些更改,您也需要做一些工作才能获得“好”的Tk应用,但这些应用至少可以使更新正常运行,并让您继续前进。