привязать один и тот же метод трассировки tkinter к нескольким переменным tk - PullRequest
0 голосов
/ 27 января 2019

Я хочу создать приложение tkinter с несколькими виджетами ввода.Я использую циклы for для создания виджетов, их упаковки и т. Д. Наконец, я хочу использовать метод трассировки tkinter для проверки ввода пользователя для каждого из виджетов ввода.Как связать одну и ту же функцию обратного вызова с несколькими переменными tkinter, используя цикл for?Я знаю, что метод trace предоставит функции обратного вызова три аргумента name, index и mode.Например, есть ли способ использовать аргумент имени как уникальный идентификатор для каждой переменной в этом цикле for?

Это мой код:

import tkinter as tk

class EntryFormular(tk.Frame):
    def __init__(self,master):
        tk.Frame.__init__(self,master)

        self.entrylist = [
        "entry 1",
        "entry 2",
        "entry 3"
        ]

        self.inputvars = list()
        self.build()

    def build(self):

        for entry in self.entrylist:

            var = tk.StringVar(self.master)
            var.trace("w",self.validateFloatInput)
            element = tk.Entry(self,textvariable=var)
            element.pack()

            self.inputvars.append(var)

    def validateFloatInput(self,name,index,mode):
        # bind this method to all 3 entry widgets
        # get variable content using .get() method
        # only allow float inputs between 0 and 1, such as 1.0 or 0.85
        pass

class Application:
    def __init__(self, master):
        self.master = master
        self.entryformular = EntryFormular(master)
        self.entryformular.pack()


if __name__ == "__main__":
    root = tk.Tk()
    my_gui = Application(root)
    root.mainloop()

1 Ответ

0 голосов
/ 27 января 2019

благодаря Джейсонхарперу!Это решило мою проблему.

Вот мой код:

import tkinter as tk
import re

class EntryFormular(tk.Frame):
    def __init__(self,master):
        tk.Frame.__init__(self,master)

        self.entrylist = [
        "entry 1",
        "entry 2",
        "entry 3"
        ]

        self.inputvars = list()
        self.build()

    def build(self):

        for entry in self.entrylist:

            var = tk.StringVar(self.master)
            var.trace("w",self.validateFloatInput)
            element = tk.Entry(self,textvariable=var)
            element.pack()
            self.inputvars.append(var)

    def validateFloatInput(self,name,index,mode):

        regex = re.compile(r'^0(\.\d+)?|1(\.0?)?$')

        for var in self.inputvars:
            if name == str(var):
                if regex.match(var.get()):
                    pass
                else:
                    var.set(var.get()[:-1])
                    self.master.bell()

class Application:
    def __init__(self, master):
        self.master = master
        self.entryformular = EntryFormular(master)
        self.entryformular.pack()


if __name__ == "__main__":
    root = tk.Tk()
    my_gui = Application(root)
    root.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...