标签和值显示

时间:2015-04-01 21:20:28

标签: python python-2.7 tkinter

我使用一个简单的代码来显示标签中数字的平方根,但由于某种原因,这些值会以我无法避免的方式重叠,这意味着,如果我将它用于具有精确平方根的数字,然后答案与前面的多位数答案相混淆。

到目前为止,我一直在使用下一个代码:

from Tkinter import *

def square_calc():
    x = x_val.get()
    sqx = x ** 0.5
    print x, "** 0.5 =", sqx
    sqx_txt = Label(root, text = "x ** 0.5 =").grid(row=3, column=0)
    sqx_lab = Label(root, text = sqx).grid(row=3, column=1)

root = Tk()
root.title("Calculating square root")

x_val = DoubleVar()

x_lab   = Label(root, text = "x").grid(row=0, column=0)
nmb     = Entry(root, textvariable = x_val).grid(row=0, column=1)
calc    = Button(root, text = "Calculate", command=square_calc).grid(columnspan=2)
y_lab   = Label(root, text = " ").grid(row=3, column=0)

root.mainloop()

2 个答案:

答案 0 :(得分:3)

问题是,每次拨打square_calc()时,您只是创建并放置另一个Label。正确的方法是在函数外部创建Label,然后让函数使用Label更新mylabel.config(text='new text')的文本。

答案 1 :(得分:1)

显示器变得混乱,因为每次调用square_calc()函数时,它都会创建新的Label对,但这可能会使任何先前的部分可见。由于左边的那个每次都是相同的,所以它并不明显,但是第1列右边的文本每次都可能不同。

解决这个问题的一个简单方法是使Label成为一个全局变量并在函数外部创建它,然后只需在函数中更改其内容即可。与所有Tkinter小部件一样,这可以在通过调用现有obj的config()方法创建之后完成。

这是代码的最低限度修改版本,用于说明这一点。请注意,它还为sticky方法调用添加了grid()关键字,以便标签在网格单元格中对其进行左对齐,使其更接近文本标签的左侧(否则它将是在细胞内中心对齐)。

from Tkinter import *

def square_calc():
    x = x_val.get()
    sqx = x ** 0.5
#    print x, "** 0.5 =", sqx
    sqx_txt = Label(root, text = "x ** 0.5 =").grid(row=3, column=0)
    sqx_lab.config(text=sqx)
    sqx_lab.grid(row=3, column=1, sticky=W)

root = Tk()
root.title("Calculating square root")

x_val = DoubleVar()

x_lab   = Label(root, text = "x").grid(row=0, column=0)
nmb     = Entry(root, textvariable = x_val).grid(row=0, column=1)
calc    = Button(root, text = "Calculate", command=square_calc).grid(columnspan=2)
y_lab   = Label(root, text = " ").grid(row=3, column=0)
sqx_lab = Label(root, text = " ")

root.mainloop()

您的代码中还有另一个潜在的严重缺陷。所有这些表格的作业

variable = Widget(...).grid(...)

导致将值None赋值给变量,因为这是grid()方法返回的内容。我没有修复它们,因为它们在这个原因中没有任何损害,因为这些变量都没有被再次引用,但如果新的全局变量sqx_lab以这种方式完成,那将会是一个问题,因为它被引用别处。