标签和值显示
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
以这种方式完成,那将是一个问题因为它在别处被引用。
我正在使用一个简单的代码来显示标签中数字的平方根,但由于某种原因,这些值以一种我无法避免的方式重叠,这意味着,如果我使用对于一个具有精确平方根的数字,那么答案就会与之前的许多数字答案混淆。
到目前为止我一直在使用下一个代码:
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
以这种方式完成,那将是一个问题因为它在别处被引用。