我刚上了我的第一个python教程,正在做一些教程。这是我的第一个练习,我正在以不同的方式解决教程提供的问题。教程有静态显示,这意味着,它复制和粘贴同一行超过10倍显示表
但是,我希望它基于给定的范围更加动态,并使用for循环多次显示它
我尝试了几种编码方法,即)在同一个功能中对显示器进行编码,在同一个功能中对显示器进行操作,等等
在代码中,我还包括了“错误检查”,以找出每个阶段的值
但是,只要代码转到“标签小部件”,它呈现的值就是循环的最后一个值,而不是每次迭代
有人能帮我写代码,但最重要的是向我解释原因吗?看起来更新“thisLabel”变量的时间问题,也许可以通过延迟来解决?我不知道怎么做,但是有更好的方法吗
from tkinter import *
def clearEntry():
entryField.delete(0, END)
def showLabel(x):
labelText.set(x)
# PROBLEM: Label only renders the last item
def showTableText(x, y, z):
base = str(x)
factor = str(y)
prod = str(z)
print(base, factor, prod)
tableText.set(base + "x" + factor + "=" + prod)
print(tableText.get())
thisLabel = Label(root, textvariable=tableText)
thisLabel.pack()
def showTable():
num = entryField.get()
showLabel("Multiplication Table of " + num)
x = int(num)
for i in range(1, tableRange+1):
prod = x*i
print(x, "x", i, "=", prod)
showTableText(x, i, prod)
root = Tk()
tableRange = 5
labelText = StringVar()
labelText.set("Multiplication Table")
tableText = StringVar()
tableText.set("---")
Label(root, textvariable=labelText).pack()
entryField = Entry(root, bg="yellow", fg="blue", text="Enter number")
entryField.pack()
Button(root, text="CLEAR", command=clearEntry).pack()
Button(root, text="SHOW TABLE", command=showTable).pack()
root.mainloop()
您首先需要了解什么是StringVar(),它是TKinter的变量类之一(BooleanVar、DoubleVar、IntVar、StringVar)。变量可以用于大多数条目小部件来跟踪对输入值的更改。它们使连接到它们的小部件在StringVar、IntVar的值改变时改变它们的值。。etc已更改(source)
因此,在您的例子中,您在名为
tableText
的全局变量中创建了一个StringVar,并将其传递给您正在创建的所有标签小部件。在循环中,您使用方法tableText.set(base + "x" + factor + "=" + prod)
不断更改函数showTableText
中的tableText
值,因此下次在循环中使用方法“set”更改“tableText”时,它将更改连接到tableText
变量的所有先前创建的标签要解决此问题,请将全局变量
tableText = StringVar()
移到函数showTableText
内部所以会是这样的:
所以,你想知道为什么它现在起作用了吗? 因为现在在每个循环中,当循环调用
showTableText
函数时,它将创建一个StringVar()
的新实例。但是,在您的代码中,它是一个全局变量,这意味着它只创建一次,并且您正在为所有标签重用同一个StringVar实例相关问题 更多 >
编程相关推荐