Python 3.x-使用文本字符串作为变量名

时间:2019-02-25 20:20:01

标签: python python-3.x tkinter

我试图避免通过使用

在代码中乘以函数
def Return_Label(self,number)  

带有参数。

任何想法如何使用字符串来将变量名定义为.set的{​​{1}}值?

下面的示例代码:

StringVar()

3 个答案:

答案 0 :(得分:0)

创建对象的列表,而不是为每个对象创建单独的属性。例如,

import tkinter as tk
from tkinter import *

class Window:
    def __init__(self):
        self.settings_window()

    def Settings_Window(self):
        self.settings_window = tk.Tk()
        self.settings_window.minsize(200,200)

        self.entries = [
            Entry(self.settings_window), 
            Entry(self.settings_window)
        ]

        for e in self.entries:
            e.pack()

        self.labelinputs = [
            StringVar(),
            StringVar()
        ]

        self.labels = [
            Label(self.settings_window, textvariable=label, bg='yellow')
            for label in self.labelinputs
        ]

        for l in self.labels:
            l.pack(expand='yes', fill='x')

        self.buttons = [
            Button(self.settings_window,text='SETUP1',command=lambda: self.return_label(0))
            Button(self.settings_window,text='SETUP2',command=lambda: self.return_label(1))
        ]

        for b in self.buttons:
            b.pack()

        self.settings_window.mainloop()

    def return_label(self,number):
        entry_field_value = self.entry.get()
        self.labelsinput[number].set(entry_field_value)

window=WINDOW()

答案 1 :(得分:0)

应不惜一切代价避免动态计算变量名。它们很难正确执行,并且使您的代码难以理解,难以维护和调试。

相反,将小部件存储在字典或列表中。例如:

def __init___(self):
    ...
    self.vars = {}
    ...
    self.vars[1] = StringVar()
    self.vars[2] = StringVar()
    ...

def Return_Label(self,number):
    self.entry_field_value = self.entry.get()
    var = self.vars[number]
    var.set(self.entry_field_value)

尽管如此,您实际上根本不需要使用StringVar -它们通常只会增加额外的开销,而不会提供任何额外的价值。您可以保存标签而不是变量,然后在标签上调用configure

self.labels[1] = Label(...)
...
self.labels[number].configure(text=self.entry_field_value)

答案 2 :(得分:0)

我更喜欢使用列表方法来管理多个输入字段并更新值。 通过使用列表,您还可以使用索引值来管理标签:D。

请参见下面的示例,了解如何使用列表处理所有值和更新。

import tkinter as tk
from tkinter import *

class Window(tk.Tk):
    def __init__(self):
        super().__init__()
        self.minsize(200, 200)
        self.entry_list = []
        self.label_list = []
        entry_count = 2

        for i in range(entry_count):
            self.entry_list.append(Entry(self))
            self.entry_list[i].pack()

        for i in range(entry_count):
            self.label_list.append(Label(self,bg='yellow'))
            self.label_list[i].pack(expand='yes', fill='x')

        Button(self, text='SETUP', command=self.Return_Label).pack()

    def Return_Label(self):
        for ndex, lbl in enumerate(self.label_list):
            lbl.config(text=self.entry_list[ndex].get())

if __name__ == '__main__':
    Window().mainloop()