我的目标是使用 for 循环创建 10 个下拉列表(我希望稍后能够访问这些值)来分配每个 StringVar() 和 tk.OptionMenu()。但是,我收到了 属性错误:
'str' object has no attribute 'set'
尽管我的变量已分配给它们一个 tkinter.StringVar 对象:
{'self.comp0': <tkinter.StringVar object at 0x046B9890>, 'self.comp1': <tkinter.StringVar object at 0x0C5E19B0>
代码:
from tkinter import OptionMenu
import tkinter as Tkinter
import tkinter.filedialog as tkFileDialog
from tkinter import messagebox as tkMessageBox
class GasGen(Tkinter.Tk):
def __init__(self,parent):
Tkinter.Tk.__init__(self,parent)
self.parent = parent
self.initialize()
self.grid()
def initialize(self):
vars= {}
for i in range(8):
name = "self.comp" + str(i)
vars[name] = Tkinter.StringVar()
menus = {}
for num, i in enumerate(vars):
names = "menu" + str(num)
menus[name] = OptionMenu(self, i, "methane", "ethane", "propane", "iso-butane", "n-butane", "iso-pentane", "n-pentane", "benzene").grid(column = 0, row = num)
print(vars)
print(".......................")
print(menus)
if __name__ == "__main__":
app = GasGen(None)
app.title('Gas mixture generator')
app.configure(background = "slate gray")
app.mainloop()
输出:
{'self.comp0': <tkinter.StringVar object at 0x03EA3670>, 'self.comp1': <tkinter.StringVar object at 0x0BB919B0>, 'self.comp2': <tkinter.StringVar object at 0x05045690>, 'self.comp3': <tkinter.StringVar object at 0x0BBE59B0>, 'self.comp4': <tkinter.StringVar object at 0x0BBE5CB0>, 'self.comp5': <tkinter.StringVar object at 0x0BBF54B0>, 'self.comp6': <tkinter.StringVar object at 0x0BBF54F0>, 'self.comp7': <tkinter.StringVar object at 0x0BBF5530>}
......................
> {'menu0': None, 'menu1': None, 'menu2': None, 'menu3': None, 'menu4':
> None, 'menu5': None, 'menu6': None, 'menu7': None}
这不是在 tkinter 中分配变量的好方法吗?如果没有,是否有更好的方法来动态生成这些变量,以允许我在 tkinter 应用程序中为其名称设置值?
最佳答案
你的语法错误。 OptionMenu(self, i
, "macet", "eth... 中的 i 实际上是一个 StringVar()
,其值是在选择Optionmenu
时设置的。因此您需要保留它的列表并初始化相应的列表。
这是工作代码。
from tkinter import OptionMenu
import tkinter as Tkinter
class GasGen(Tkinter.Tk):
def __init__(self,parent):
Tkinter.Tk.__init__(self,parent)
self.parent = parent
self.vars = []
self.initialize()
self.grid()
def initialize(self):
for i in range(8):
t = Tkinter.StringVar()
t.set("Not Selected")
self.vars.append(t)
for i in range(len(self.vars)):
OptionMenu(self, self.vars[i], "methane", "ethane", "propane", "iso-butane", "n-butane", "iso-pentane", "n-pentane", "benzene").grid(column = 0, row = i)
Tkinter.Button(text="Show Values", command=self.show).grid(pady=10)
def show(self):
Tkinter.Label(text="\n".join([k.get() for k in self.vars])).grid(pady=10)
if __name__ == "__main__":
app = GasGen(None)
app.title('Gas mixture generator')
app.configure(background = "slate gray")
app.mainloop()
关于python - 在 tkinter 应用程序中创建和分配多个变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53709036/