Tkinter 中关于字符串变量问题
from tkinter import *
root=Tk()
cattle=["犀牛","牦牛","水牛","奶牛"]
for i in range(len(cattle)):
b=StringVar()
b.set(cattle)
Button(root,textvariable=b).pack()
mainloop()
上 面 的 程 序 与 下 面 的 程 序 ,为 什 么 运 行 结 果 不 一 样 呢 ?
from tkinter import *
root=Tk()
cattle=["犀牛","牦牛","水牛","奶牛"]
b=StringVar()
for i in range(len(cattle)):
b.set(cattle)
Button(root,textvariable=b).pack()
mainloop() 问题解答:
两个代码的核心区别在于 StringVar 的作用域和绑定方式:
[*]第一个程序:
每个按钮都创建 新的StringVar
for i in range(len(cattle)):
b=StringVar()# 每次循环都新建变量
b.set(cattle)
Button(...textvariable=b)# 每个按钮绑定独立变量
结果:每个按钮显示独立的内容(但代码中 cattle 用法有问题)
[*]第二个程序:
所有按钮共享 同一个StringVar
b=StringVar()# 在循环外创建变量
for i in range(len(cattle)):
b.set(cattle)# 反复修改同一个变量
Button(...textvariable=b)# 所有按钮绑定同一变量
结果:所有按钮显示最后一次 b.set() 的内容
问题根源:
Tkinter 的 textvariable 是 实时绑定。第二个代码中:
1. 所有按钮都绑定到同一个变量
2. 循环结束后变量最终值为最后一次设置的值
3. 所有按钮会同步显示最新值
建议改进:
若要让每个按钮显示不同内容,应该:
cattle = ["按钮1", "按钮2", "按钮3"]# 需要是列表
for text in cattle:
btn = Button(root, text=text)# 直接使用text参数更简单
btn.pack()
若必须用 StringVar,请保持第一个程序的创建方式,但需要修复循环逻辑:
for item in cattle:# 直接遍历元素
var = StringVar(value=item)
Button(root, textvariable=var).pack()
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 第一个是每次都创建一个stringvar,第二个只有一个stringvar.
页:
[1]