简体   繁体   English

在Tkinter应用程序中创建和分配多个变量

[英]Creating and assigning multiple variables in a tkinter application

My aim is to create 10 dropdown lists (I want to be able to access these values later on) using a for loop to assign each StringVar() and tk.OptionMenu(). 我的目标是使用for循环创建10个下拉列表(我希望以后可以访问这些值),以分配每个StringVar()和tk.OptionMenu()。 However, I am receiving a AttributeError: 但是,我收到AttributeError:

'str' object has no attribute 'set' 'str'对象没有属性'set'

despite my variables having assigned to them a tkinter.StringVar object: 尽管我的变量分配给他们一个tkinter.StringVar对象:

{'self.comp0': <tkinter.StringVar object at 0x046B9890>, 'self.comp1': <tkinter.StringVar object at 0x0C5E19B0>

code: 码:

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()

out: 出:

{'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}

Is this not a good way to assign variables in tkinter? 这不是在tkinter中分配变量的好方法吗? If not, is there a better way to dynamically generate these variables to allow to me set values to their names in the tkinter application? 如果不是,是否有更好的方法来动态生成这些变量,以允许我在tkinter应用程序中将值设置为其名称?

Your syntax is wrong. 您的语法错误。 The i in OptionMenu(self, i , "methane", "eth... is actually a StringVar() , whose value is set when an Optionmenu is selected. So you need to keep a list of it and initialise the corresponding one. OptionMenu (自我, i ,“甲烷”,“ETH ......实际上是一个StringVar()其值设置时Optionmenu被选中。所以,你需要保持它的列表,并初始化相应的一个。

Here is the working code. 这是工作代码。

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()

在此处输入图片说明

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM