Python 3.x - использование текстовой строки в качестве имени переменной - PullRequest
0 голосов
/ 25 февраля 2019

Я пытаюсь избежать умножения функций в коде, используя

def Return_Label(self,number)  

с параметром.

Любая идея, как использовать строку для определения имени переменной, которое можно использовать для .set значения для StringVar()?

Пример кода ниже:

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.entry = Entry(self.settings_window)
        self.entry.pack()
        self.entry2 = Entry(self.settings_window)
        self.entry2.pack()
        self.label1input = StringVar()
        self.label = Label(self.settings_window,textvariable=self.label1input, bg='yellow')
        self.label.pack(expand='yes',fill='x')
        self.label2input = StringVar()
        self.label2 = Label(self.settings_window, textvariable=self.label2input, bg='yellow')
        self.label2.pack(expand='yes', fill='x')
        self.button = Button(self.settings_window,text='SETUP1',command=self.Next)
        self.button.pack()
        self.button2 = Button(self.settings_window,text='SETUP2',command=self.Next2)
        self.button2.pack()
        self.settings_window.mainloop()

    def Next(self):
        self.number=1
        self.Return_Label(self.number)

    def Next2(self):
        self.number=2
        self.Return_Label(self.number)

    def Return_Label(self,number):
        self.entry_field_value = self.entry.get()
        print(self.entry_field_value)
        #self.label1input.set(self.entry_field_value)
        setattr(self,'label'+str(number)+'input.set',self.entry_field_value)

window=WINDOW()

Ответы [ 3 ]

0 голосов
/ 25 февраля 2019

Следует избегать динамического вычисления имен переменных любой ценой.Их трудно сделать правильно, и это делает ваш код трудным для понимания, сложным для сопровождения и трудным для отладки.

Вместо этого сохраняйте виджеты в словаре или списке.Например:

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)
0 голосов
/ 26 февраля 2019

Я предпочитаю списочный подход к управлению несколькими полями ввода и обновлению значений.Используя список, вы также можете использовать значение индекса для управления метками: 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()
0 голосов
/ 25 февраля 2019

Создание списков объектов, а не отдельных атрибутов для каждого объекта.Например,

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...