标签和值显示

Label and value display

我正在使用一个简单的代码来显示标签中数字的平方根,但由于某种原因,这些值以一种我无法避免的方式重叠,这意味着,如果我使用对于一个具有精确平方根的数字,那么答案就会与之前的许多数字答案混淆。

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

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

问题在于,每次调用 square_calc() 时,您只是在创建并放置另一个 Label。正确的做法是在函数外部创建一个 Label,然后让函数用 mylabel.config(text='new text').

更新 Label 的文本

显示变得混乱,因为每次调用您的 square_calc() 函数时,它都会创建一对新的 Label,但这可能会使之前的某些部分可见。由于左边的每次都是相同的,所以它不会引人注意,但第 1 列右边的文本每次都可能不同。

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

这是您的代码的最小修改版本,说明了如何执行此操作。请注意,它还在 grid() 方法调用中添加了一个 sticky 关键字参数,以便标签在网格单元格中左对齐,因此它更接近紧邻其左侧的文本标签(否则它会在单元格内居中对齐)。

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() 方法 returns。我没有修复它们,因为它们在这个原因中没有害处,因为这些变量中的 none 曾经被再次引用,但如果新的全局变量 sqx_lab 以这种方式完成,那将是一个问题因为它在别处被引用。