Я создаю программу на Python для книги по ролевой игре. Я хочу отображать параметры героя только в спинбоксах. Иногда параметры изменяю я, а иногда — запускаю алгоритмы. Я бы хотел, чтобы значения, показанные в счетчиках, обновлялись, когда они НЕ изменяются мной.
Изменить: мне наконец удалось заставить его работать так, как задумано. Но можно ли написать лучше, в частности, чтобы избавиться от «глобальности»?
from tkinter import *
class App(Tk):
def __init__(self, size, hero):
global stringvar_life
super().__init__()
stringvar_life = StringVar()
self.hero = hero
self.hero.update_stringvar_life()
self.geometry('%dx%d' % (size))
self.minsize(*size)
self.maxsize(*size)
self.columnconfigure((0, 1), weight=1, uniform='a')
self.rowconfigure((0), weight=1, uniform='a')
self.create_widgets()
self.mainloop()
def create_widgets(self):
# To simulate hero.life being modified by an algorithm :
Button(self, text="SUBSTRACT 1",
command=self.substract_1).grid(row=0, column=1)
# fra (spinbox + label)
fra = Frame(self)
fra.grid(row=0, column=0, sticky="nsew", padx=10)
# Spinbox linked to fra
self.spb = Spinbox(fra, from_=-10, to=100,
textvariable=stringvar_life,
command=self.on_spinbox_change,
width=3, justify="right")
self.spb.pack(side=RIGHT, expand=NO, fill=X)
# Label linked to fra
label = Label(fra, width=20, text="LIFE POINTS", anchor='e', padx=5)
label.pack(side=RIGHT)
def substract_1(self):
self.hero.modify_life(-1)
def on_spinbox_change(self):
# instant update of hero.life :
self.hero.life = int(self.spb.get())
print("from spinbox :", self.hero.life) # debug
class Hero():
global stringvar_life
def __init__(self):
self.life = 17
def modify_life(self, x):
self.life += x
print("from algorithm :", self.life) # debug
self.update_stringvar_life()
def update_stringvar_life(self):
stringvar_life.set(str(self.life))
if __name__ == "__main__":
HERO = Hero()
WINDOW = App((350,70), HERO)
Подробнее здесь: https://stackoverflow.com/questions/798 ... -a-spinbox