如何从单个tkinter Entry小部件获取不同变量的整数输入?

时间:2020-04-16 18:21:50

标签: python events tkinter input tkinter-entry

我正在编写用于生态系统仿真的代码,用户可以在其中调整初始值,例如人口规模,生育力等。我不想使用为每个变量编写方法的方法,而是为每个变量编写方法。我也想排除非整数作为输入,并将可接受的值限制在一定范围内。

但是,最后一个要求在我的代码中失败了,因为每个变量的范围限制相互影响。基本上是因为我无法将参数添加到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()

0 个答案:

没有答案