Как связать текстовую переменную с атрибутом класса, чтобы обновить счетчик?Python

Программы на Python
Ответить
Anonymous
 Как связать текстовую переменную с атрибутом класса, чтобы обновить счетчик?

Сообщение Anonymous »

Я создаю программу на 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»