Tkinter标签重叠

时间:2018-12-22 19:03:42

标签: python tkinter label

我是python和tkinter的新手,我正在尝试制作一个非常简单且基本的计算器。

除了我想在不重新启动程序的情况下打印出2个结果的标签重叠之外,这段代码可以按我的预期工作。

这是我打印50 * 50,然后将其更改为50/50而不重新启动程序的样子。

enter image description here

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

2 个答案:

答案 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