Tkinter GUI计算器条目值

时间:2017-06-27 09:06:11

标签: python user-interface tkinter

我使用Python构建了一个基本的计算器。但后来,我尝试用Tkinter制作一个真正的GUI计算器。问题是我不知道如何获取值以及如何返回特定操作。

基本上我的应用程序是这样的:

  • 3个条目(第一个值,第二个值,结果)
  • 4个按钮(加,减,乘,除)。

我希望我的程序做的是:当有人在第一个条目中输入一个值而在第二个条目中输入另一个值时,点击例如" Subtract"在第三个条目中,将显示减去这些数字的结果。我是python的新手,我发现它看起来太复杂了。

from tkinter import *


def my_increase(a, b):
    return a + b


def my_decrease(a, b):
    return a - b


def my_multiply(a, b):
    return a * b


def my_divide(a, b):
    return a / b


main = Tk()

label_1 = Label(main, text="Calculator", height=5, width=30)
label_1.config(font=("OpenSans", 15))
label_1.pack()
frame_0 = Frame(main)
frame_0.pack()
frame_1 = Frame(main)
frame_1.pack()
frame_2 = Frame(main)
frame_2.pack()

button_1 = Button(frame_1, text="Add", fg="blue", command=my_increase)
button_1.config(font=("Lato", 12))
button_1.pack(side=LEFT)
button_2 = Button(frame_1, text="Subtract", fg="blue", command=my_decrease)
button_2.config(font=("Lato", 12))
button_2.pack(side=RIGHT)
button_3 = Button(frame_2, text="Multiply", fg="blue", command=my_multiply)
button_3.config(font=("Lato", 12))
button_3.pack(side=LEFT)
button_4 = Button(frame_2, text="Divide", fg="blue", command=my_divide)
button_4.config(font=("Lato", 12))
button_4.pack(side=RIGHT)
entry_1 = Entry(frame_0, bd=5)
entry_1.pack(side=TOP)
entry_2 = Entry(frame_0, bd=5)
entry_2.pack(side=TOP)
entry_3 = Entry(frame_0, bd=5)
entry_3.pack(side=TOP)
main.mainloop()

2 个答案:

答案 0 :(得分:1)

附加到每个按钮的功能不应该需要任何参数。在您的示例中,您已使用两个参数a a和b定义了my_increase函数。但是通过单击按钮,没有参数传递给函数。相反,您可以从文本框中访问值并添加它们。例如。

要从文本框中访问值,您可以使用

entry_1.get()

要在文本框中设置值,您可以使用

entry_3.insert(0, "test")

这是您的代码,它执行所有必需的操作,如加法,减法。等

from Tkinter import *


def my_increase():
    entry_3.delete(0, END)
    entry_3.insert(0, int(entry_1.get()) + int(entry_2.get()))


def my_decrease():
    entry_3.delete(0, END)
    entry_3.insert(0, int(entry_1.get()) - int(entry_2.get()))


def my_multiply():
    entry_3.delete(0, END)
    entry_3.insert(0, int(entry_1.get()) * int(entry_2.get()))


def my_divide():
    entry_3.delete(0, END)
    entry_3.insert(0, int(entry_1.get()) / int(entry_2.get()))


main = Tk()

label_1 = Label(main, text="Calculator", height=5, width=30)
label_1.config(font=("OpenSans", 15))
label_1.pack()
frame_0 = Frame(main)
frame_0.pack()
frame_1 = Frame(main)
frame_1.pack()
frame_2 = Frame(main)
frame_2.pack()

button_1 = Button(frame_1, text="Add", fg="blue", command=my_increase)
button_1.config(font=("Lato", 12))
button_1.pack(side=LEFT)
button_2 = Button(frame_1, text="Subtract", fg="blue", command=my_decrease)
button_2.config(font=("Lato", 12))
button_2.pack(side=RIGHT)
button_3 = Button(frame_2, text="Multiply", fg="blue", command=my_multiply)
button_3.config(font=("Lato", 12))
button_3.pack(side=LEFT)
button_4 = Button(frame_2, text="Divide", fg="blue", command=my_divide)
button_4.config(font=("Lato", 12))
button_4.pack(side=RIGHT)
entry_1 = Entry(frame_0, bd=5)
entry_1.pack(side=TOP)
entry_2 = Entry(frame_0, bd=5)
entry_2.pack(side=TOP)
entry_3 = Entry(frame_0, bd=5)
entry_3.pack(side=TOP)
main.mainloop()

答案 1 :(得分:0)

编写得很糟糕,所以请使用一些建议并查看tkinter上的教程:

  1. 仅导入您需要的内容
  2. 将所有内容都放在课堂上。 (__init__应该接受一个Tk对象,创建所有小部件并启动循环,脚本只是初始化你的类对象)。
  3. 你想要什么:

    1. 首先使entry_3可更新使用:

      result = DoubleVar()

      entry_3 = Entry(frame_0, bd=5,textvar=result)

      这在类中是self.result,因此您可以很好地从任何方法访问它。

    2. 在动作方法中,您现在只需设置此变量,例如添加:

      result.set(a+b)

      一个班级中的

      self.result。这样可以避免全局变量。这应该替换return语句,您不会在任何地方返回。

    3. 如您所见,您的函数有两个参数。按钮按下不发送。您可以使用entry_1.get()自己阅读方法中的输入字段,并且不接受任何参数。另一个选择是按下发送它们:

      button_2 = Button(frame_1, text="Subtract", fg="blue", command=lambda: my_decrease(float(entry_1.get()),float(entry_2.get())))

    4. 我会选择前者,并访问对象的entry_[1,2]字段(self.entry...)。祝你好运。