|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- from tkinter import *
- root=Tk()
- cattle=["犀牛","牦牛","水牛","奶牛"]
- for i in range(len(cattle)):
- b=StringVar()
- b.set(cattle[i])
- Button(root,textvariable=b).pack()
- mainloop()
复制代码
上 面 的 程 序 与 下 面 的 程 序 ,为 什 么 运 行 结 果 不 一 样 呢 ?
- from tkinter import *
- root=Tk()
- cattle=["犀牛","牦牛","水牛","奶牛"]
- b=StringVar()
- for i in range(len(cattle)):
- b.set(cattle[i])
- 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 小助理,如未能正确解答您的问题,请继续追问。
|
|