如何获取影响tkinter实验室的实例名称

2024-06-13 15:13:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望能够使用传递给它的类的实例调用子例程,然后使用实例名称的字符串来影响更新哪个tkinter标签

我知道这是一个奇怪的具体和复杂的方式问一些事情,可能很简单,但我不善于在谷歌表达我需要什么

我正在做一个辐射启发的游戏,我想让玩家选择一个敌人射击和更新他们的生命计。到目前为止,我已经完成了射击子程序背后的所有数学运算,我只是不知道如何在最后找到正确的label小部件

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)

如果你能理解我想表达的意思,并且有一个解决方案,我会非常感谢你的帮助。谢谢


Tags: textnameselffalseifrootlabelgrid
1条回答
网友
1楼 · 发布于 2024-06-13 15:13:46

如果我理解正确,那么您需要更改与传递给Shoot方法的Raider对象相关的健康标签

这里有一个可行的解决方案,但我不确定这是否是一个建议的方法,因为你必须非常小心

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的id,可以通过widget.__str__()方法看到

但是您可以在创建小部件时向其添加用户定义的名称,如本解决方案所示(请确保每个小部件都有一个唯一的名称,以避免出现问题)。如果您创建两个具有相同名称的小部件,那么它将只创建第一个小部件,第二个小部件将只是对同一个小部件的引用)。然后您可以在任何小部件/窗口上调用nametowidget()方法,并提供相对/绝对路径来获取小部件对象(并在小部件上执行操作)

如果你有问题请告诉我

PS:小部件名称不能以大写字母开头

相关问题 更多 >