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