Как получить имя экземпляра, чтобы повлиять на метку tkinter - PullRequest
1 голос
/ 28 марта 2019

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

Я знаюэто странно конкретный и запутанный способ спросить что-то, что, вероятно, довольно просто, но я плохо формулирую то, что мне нужно, в Google.

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

from tkinter import *
Root = Tk()

PlrWeapon = ["Pipe Revolver Rifle",6,5,0]

class Raider:
    Species = "Human"
    def __init__(self, Name, Level, MaxHealth, Health, Alive, Unique, Weapon, Armour):
        self.Name = Name
        self.Level = Level
        self.MaxHealth = MaxHealth
        self.Health = Health
        self.Alive = Alive
        self.Unique = Unique
        self.Weapon = Weapon
        self.Armour = Armour

def Shoot(self):
    Damage = 0
    for i in range(1,4):
        Difference = PlrWeapon[i] - self.Armour[i]
        if Difference >= 0:
            Damage = Damage + Difference
    self.Health = self.Health - Damage
    if self.Health <= 0:
        self.Alive = False

Enemy1 = Raider("Tessa",
                5,
                50,
                50,
                True,
                False,
                ["Pipe Pistol",3,2,0],
                ["Armourless",0,0,0])

Enemy2 = Raider("Bobby",
                5,
                50,
                50,
                True,
                False,
                ["Pipe Rifle",5,4,0],
                ["Leather",2,3,1])

Shoot(Enemy1)

Enemy1Name = Label(Root, text=Enemy1.Name)
Enemy1Name.grid(row=0, column=0)
Enemy1Health = Label(Root, text=Enemy1.Health)
Enemy1Health.grid(row=0, column=1)

Enemy2Name = Label(Root, text=Enemy2.Name)
Enemy2Name.grid(row=1, column=0)
Enemy2Health = Label(Root, text=Enemy2.Health)
Enemy2Health.grid(row=1, column=1)

Root.mainloop()

, в идеале в конце процедуры Shoot()быть частью, которая действовала так

def Shoot(self):
    Damage = 0
    for i in range(1,4):
        Difference = PlrWeapon[i] - self.Armour[i]
        if Difference >= 0:
            Damage = Damage + Difference
    self.Health = self.Health - Damage
    if self.Health <= 0:
        self.Alive = False

    ## start of wishful thinking ##

    str(self)+"Health".config(text=self.Health)

Если вы понимаете, о чем я пытаюсь сообщить, и у меня есть решение, я был бы очень признателен за помощь.Спасибо.

1 Ответ

0 голосов
/ 28 марта 2019

Если я вас правильно понял, вы хотите изменить метку работоспособности, связанную с объектом Raider, переданным методу Shoot.

Вот решение, которое может сработать, но я не уверен, что это рекомендуемый способ, так как вы должны быть очень осторожны.

def Shoot(self, win):
    Damage = 0
    for i in range(1,4):
        Difference = PlrWeapon[i] - self.Armour[i]
        if Difference >= 0:
            Damage = Damage + Difference
    self.Health = self.Health - Damage
    if self.Health <= 0:
        self.Alive = False
    win.nametowidget('.health{}'.format(self.Name)).config(text=self.Health)

Enemy1Name = Label(Root, text=Enemy1.Name, name='name'+Enemy1.Name)
Enemy1Name.grid(row=0, column=0)
Enemy1Health = Label(Root, text=Enemy1.Health, name='health'+Enemy1.Name)
Enemy1Health.grid(row=0, column=1)

Enemy2Name = Label(Root, text=Enemy2.Name, name='name'+Enemy2.Name)
Enemy2Name.grid(row=1, column=0)
Enemy2Health = Label(Root, text=Enemy2.Health, name='health'+Enemy2.Name)
Enemy2Health.grid(row=1, column=1)

Виджеты хранятся в виде древовидной структуры в tkinter, где ваше окно Tk() является корневым, представленным .. Тогда его дочерние элементы будут представлены как .unique_widget1_id, а дочерние элементы widget1 - как .unique_widget1_id.unique_widget2_id. По умолчанию tkinter создает идентификаторы, подобные .140343920750152, которые можно увидеть с помощью метода widget.__str__().

Но вы можете добавлять пользовательские имена к виджетам при их создании, как показано в этом решении (Пожалуйста, убедитесь, что у каждого виджета есть уникальное имя, чтобы избежать проблем. Если вы создаете два виджета с одинаковым именем, он будет создаваться только первым второй виджет будет просто ссылкой на один и тот же виджет). Затем вы можете вызвать метод nametowidget() для любого виджета / окна и указать относительный / абсолютный путь для получения объекта виджета (и выполнения операций с виджетом).

Дайте мне знать, если у вас есть вопросы.

PS: имя виджета не может начинаться с заглавной буквы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...