我是python和tkinter的新手,我正在尝试制作一个非常简单且基本的计算器。
除了我想在不重新启动程序的情况下打印出2个结果的标签重叠之外,这段代码可以按我的预期工作。
这是我打印50 * 50,然后将其更改为50/50而不重新启动程序的样子。
from tkinter import *
w = Tk()
#****FUNCTIONS****
def multiply():
number1 = float(e1.get())
number2 = float(e2.get())
result1 = number1 * number2
resultlabel1 = Label(w, text=result1)
resultlabel1.grid(row=2, column=0)
def division():
number1 = float(e1.get())
number2 = float(e2.get())
result1 = number1 / number2
resultlabel1 = Label(w, text=result1)
resultlabel1.grid(row=2, column=0)
def addition():
number1 = float(e1.get())
number2 = float(e2.get())
result1 = number1 + number2
resultlabel1 = Label(w, text=result1)
resultlabel1.grid(row=2, column=0)
def subtraction():
number1 = float(e1.get())
number2 = float(e2.get())
result1 = number1 - number2
resultlabel1 = Label(w, text=result1)
resultlabel1.grid(row=2, column=0)
# ****LABELS, ENTRIES AND BUTTONS****
l1 = Label(w, text="First number: ")
l2 = Label(w, text="Second number: ")
e1 = Entry(w)
e2 = Entry(w)
b1 = Button(w, text="*", command=multiply)
b2 = Button(w, text="/", command=division)
b3 = Button(w, text="-", command=subtraction)
b4 = Button(w, text="+", command=addition)
b5 = Button(w, text="Exit", command=w.quit)
#****PLACEMENTS****
l1.grid(row=0, column=0)
l2.grid(row=1, column=0)
e1.grid(row=0, column=1)
e2.grid(row=1, column=1)
b1.grid(row=0, column=2)
b2.grid(row=0, column=3)
b3.grid(row=1, column=3)
b4.grid(row=1, column=2)
b5.grid(row=2, column=4)
w.mainloop()
答案 0 :(得分:2)
在创建其余GUI的功能之外定义resultlabel1
。然后添加
resultlabel1.config(text=result1)
代替所有函数-即使标签在函数下方定义,它仍然可以工作,因为它现在是全局变量。这样,不必每次都创建一个新标签,而只需更改一个标签中显示的文本,从而防止任何重叠。
答案 1 :(得分:1)
在每个函数中,您将创建一个新的resultLabel1
。这意味着您每次进行计算时都将创建新标签,而不是覆盖或编辑相同标签。
每次在每个函数中创建一个新标签时,您都在创建一个local
变量。这意味着该变量只能在该函数中使用,这就是为什么它不会在所有其他函数中被覆盖的原因。
要解决此问题,您可以与其他所有对象一起创建Label
小部件:
l1 = Label(w, text="First number: ")
l2 = Label(w, text="Second number: ")
e1 = Entry(w)
e2 = Entry(w)
b1 = Button(w, text="*", command=multiply)
b2 = Button(w, text="/", command=division)
b3 = Button(w, text="-", command=subtraction)
b4 = Button(w, text="+", command=addition)
b5 = Button(w, text="Exit", command=w.quit)
resultlabel1 = Label(w) # leave the text empty when you first create it
然后,您也可以将其与所有其他小部件一起添加到窗口中:
l1.grid(row=0, column=0)
l2.grid(row=1, column=0)
e1.grid(row=0, column=1)
e2.grid(row=1, column=1)
b1.grid(row=0, column=2)
b2.grid(row=0, column=3)
b3.grid(row=1, column=3)
b4.grid(row=1, column=2)
b5.grid(row=2, column=4)
resultlabel1.grid(row=2, column=0)
-
通过在函数的外部中创建标签,这意味着它是global
变量,可以在任何地方使用。
我将使用乘法功能作为示例。您需要做的第一件事就是全球化resultLabel1
。这意味着它可以在函数中用作global
变量,并且该函数不应使用自己的local
变量。
现在,您不必每次运行计算都创建新的resultLabel1
实例,而应编辑已经创建的现有标签。使用global resultLabel1
使我们可以从此函数内访问变量。要编辑窗口小部件,请使用.config(**options)
,并将要更改的内容作为争论点(see here for more)。因此,在这种情况下,您将运行resultLabel1.config(text=result1)
def multiply():
global resultLabel1 # means the function can use the global variable
number1 = float(e1.get())
number2 = float(e2.get())
result1 = number1 * number2
resultlabel1.config(text=result1) # edits the variable's text