Как получить целочисленный ввод для различных переменных из одного виджета ввода tkinter? - PullRequest
0 голосов
/ 16 апреля 2020

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

Однако последнее требование не выполняется в моем коде, поскольку пределы диапазона для каждой переменной влияют друг на друга. В основном потому, что я не могу добавить аргументы в метод entry.bind. Как это решить?

Ниже вы найдете упрощенную версию моего кода, в которой возникает проблема.

import tkinter as tk
class Window():
    def __init__(self):
        tk.Label(master, text ='Fox number').grid(row=0,column=0)
        tk.Label(master, text ='Hare number').grid(row=1,column=0)
        self.fox_entry=tk.Entry(master, width=5)
        self.fox_entry.grid(row=0, column=1)
        self.hare_entry=tk.Entry(master, width=5)
        self.hare_entry.grid(row=1, column=1)

class Ecosystem():
    def __init__(self):
        self.foxnumber = 10
        self.harenumber = 100

    def initiate(self):

        def input_user(entry,value, minval, maxval):
            self.value = value
            self.inputvalue = value
            self.minval = minval
            self.maxval = maxval

            def get_value(event):
                try:
                    self.inputvalue = int(entry.get())
                    print(self.inputvalue)
                except ValueError:
                    entry.delete(0,'end')
                    entry.insert(0,self.value)
                    self.inputvalue = self.value
                if self.inputvalue not in range(self.minval, self.maxval+1):
                    entry.delete(0,'end')
                    entry.insert(0,self.value)                     
                    self.inputvalue = self.value
                print(self.inputvalue)

            entry.bind('<Return>', get_value)
            value = self.inputvalue
            return value

        my_win.fox_entry.insert(0,self.foxnumber)
        self.foxnumber = input_user(my_win.fox_entry,self.foxnumber, 0, 50)  

        my_win.hare_entry.insert(0,self.harenumber)
        self.harenumber = input_user(my_win.hare_entry,self.harenumber, 0, 200)
        # more variables will added later on

master = tk.Tk()
my_win = Window()
my_ecosystem = Ecosystem()
my_ecosystem.initiate()
master.mainloop()

...