使用Python 3在Tkinter中使用计算器程序的问题

时间:2014-12-10 19:37:30

标签: python tkinter calculator

这是代码(见下面的编辑):

from tkinter import *

my_int_var = 0

def button_1_method():      #what's important is this method and the button_1 defined below
    my_int_var.set = my_int_var.get + 1
    entry_field.set = my_int_var

root = Tk()
frame_1 = Frame(root)
frame_1.pack()
frame_2 = Frame(root)
frame_2.pack()
frame_3 = Frame(root)
frame_3.pack()
frame_4=Frame(root)
frame_4.pack()

entry_field = Entry(frame_4)
entry_field.pack()

button_add = Button(frame_1, text = "add")
button_subtract = Button(frame_1, text = "subtract")
button_multiply = Button(frame_1, text = "multiply")
button_divide = Button(frame_1, text = "divide")
button_calculate = Button(frame_3, text = "calculate")
button_calculate.pack()

button_add.grid(row = 0)
button_subtract.grid(row = 0, column = 1)
button_multiply.grid(row=0,column= 2)
button_divide.grid(row=0,column = 3)

button_1 = Button(frame_2,text = "1", command = button_1_method())
button_2 = Button(frame_2,text = "2")
button_3 = Button(frame_2,text = "3")
button_4 = Button(frame_2,text = "4")
button_5 = Button(frame_2,text = "5")
button_6 = Button(frame_2,text = "6")
button_7 = Button(frame_2,text = "7")
button_8 = Button(frame_2,text = "8")
button_9 = Button(frame_2,text = "9")
button_0 = Button(frame_2,text = "0")

button_1.grid(row = 0)
button_2.grid(row = 0,column = 1)
button_4.grid(row=0, column= 3)
button_5.grid(row=0, column= 4)
button_6.grid(row=0, column= 5)
button_7.grid(row=0, column= 6)
button_8.grid(row=0, column= 7)
button_9.grid(row=0, column= 8)
button_0.grid(row=0, column= 9)

root.mainloop()

每次按下“one”按钮时,我都会尝试在条目中显示的数字加“1”。但是我正在玩button_1_method并遇到各种错误。如何修复它,以便每当我按下一个按钮时,条目中的数字都会加一个“1”(与其余的数字按钮相同)?

编辑:我改变了一点:

my_str_var = StringVar()

def button_1_method(my_str_var):
    my_str_var.set(my_str_var.get() + 1)
    entry_field.set(my_str_var)


button_1 = Button(frame_2,text = "1", command = button_1_method)

现在这是我得到的错误:

Traceback (most recent call last):
  File "C:/Users/TOTTY/PycharmProjects/beginnerpoject/python calculator.py", line 5, in <module>
    my_str_var = StringVar()
  File "C:\Python34\lib\tkinter\__init__.py", line 332, in __init__
    Variable.__init__(self, master, value, name)
  File "C:\Python34\lib\tkinter\__init__.py", line 236, in __init__
    self._root = master._root()
AttributeError: 'NoneType' object has no attribute '_root'

1 个答案:

答案 0 :(得分:1)

set方法,您必须调用。同样适用于get

所以,而不是:

my_int_var.set = my_int_var.get + 1

这样做:

my_int_var.set(my_int_var.get() + 1)

但是你还有另外一个问题。 my_int_var不是Tk IntVar,它只是一个普通的旧int,它没有这样的方法。并且它也没有以任何方式附加到您的Entry小部件。

因此,您需要使用my_int_var = IntVar()创建一个Tk var,然后您需要在构造函数或config调用中将其传递给窗口小部件。

如果你看一下你找到get和set方法的文档,你会看到一些应该让它变得明显的例子。特别是,请参阅Entry文档中的模式下的第三个示例(但请务必阅读整个部分)。


除了与您的错误直接相关的问题之外,还有其他问题。例如:

button_1 = Button(frame_2,text = "1", command = button_1_method())

您希望将函数button_1_method作为命令传递。但那不是你在做什么的;你正在调用该函数,获取其返回值,并将 作为命令传递。 (这与你的第一个问题完全相反,你想要调用一个函数但是关闭了parens。当你想要调用一个函数以及你想把它当作一个值时,你不能指望Python猜测;括号是你如何告诉它调用函数。)

同样,正如我在评论中提到的那样,即使你做到了这一点,在数字上加1不是计算器上的1键。你需要直接得到一个数字和它的字符串表示之间的差异,否则你将会遇到很多这个应用程序的问题。 1 != '1',但str(1) == '1' and 1 == int('1')

在您的更新版本中,您已将其更改为使用StringVar,其值当然是字符串,并且您尝试将1添加到其值中。那是同样的问题。同样,数字1和字符串'1'不是一回事。

当你没有这样的方法时,你也试图在set对象上调用Entry方法。阅读Entry文档以了解如何更改或替换Entry的值 - 但如果您使用StringVar(如编辑后的代码中所示),则不需要首先要做到这一点。这是将变量绑定到窗口小部件的全部要点;任何一个的变化都会影响另一个。因此,当您致电my_str_var.get时,您将获得Entry窗口小部件的当前内容,并且当您致电my_str_var.set时,您正在替换窗口小部件的内容。