import tkinter as tk import math class CrashGui: MINS = 4**5 MAXS = 4**21 def __init__(self, parms=None): self.root = tk.Tk() self.root.title("Crash") vcmd = (self.root.register(self.validate_spin), '%W', '%P') self.frame = tk.Frame(self.root, borderwidth=0, relief=tk.RIDGE, bg="white") self.frame.pack(fill=tk.BOTH, expand=1) self.c1 = tk.Frame(self.frame, bg="white") self.c1.pack(fill=tk.X, expand=1) self.vara = tk.StringVar() self.vara.set(2) self.spina = tk.Spinbox(self.c1, justify="right", width=4, bd=2, from_=0, to=21, textvariable=self.vara) self.spina.config(validate="key", validatecommand=vcmd) self.spina.grid(row=0, column=0, sticky="w") self.varb = tk.StringVar() self.varb.set(6) self.spinb = tk.Spinbox(self.c1, justify="right", width=4, bd=2, from_=0, to=21, textvariable=self.varb) self.spinb.config(validate="key", validatecommand=vcmd) self.spinb.grid(row=1, column=0, sticky="w") def validate_spin(self, name, new_val): widget = self.root.nametowidget(name) try: vda = int(self.spina.get() if widget==self.spinb else new_val) vdb = int(self.spinb.get() if widget==self.spina else new_val) valid = vdb <= 21 and vda <= 21 if valid: if widget == self.spina: f = max(0, math.ceil(math.log2(self.MINS/(4**vda)))) t = min(21, math.floor(math.log2(self.MAXS/(4**vda)))) self.spinb.config(validate=None) self.varb.set(min(max(vdb,f),t)) self.spinb.config(validate="key") else: f = max(0, math.ceil(math.log2(self.MINS/(2**vdb))/2)) t = min(21, math.floor(math.log2(self.MAXS/(2**vdb))/2)) self.spina.config(validate=None) self.vara.set(min(max(vda,f),t)) self.spina.config(validate="key") except ValueError: valid = False return valid if __name__ == "__main__": CrashGui() tk.mainloop()