Как запустить функцию в классе для каждого объекта этого класса? - PullRequest
2 голосов
/ 18 октября 2019

, как говорится в названии, я хочу сократить это:

while run:
        global mouse
        mouse = pygame.mouse.get_pos()

        first_button = button(pic, .1, .1, .1, .1)
        second_button = button(pic, .25, .1, .1, .1)
        third_button = button(pic, .75, .1, .1, .1)
        first_button.drawButton()
        second_button.drawButton()
        third_button.drawButton()

до чего-то вроде этого:

while run:
        global mouse
        mouse = pygame.mouse.get_pos()

        first_button = button(pic, .1, .1, .1, .1)
        second_button = button(pic, .25, .1, .1, .1)
        third_button = button(pic, .75, .1, .1, .1)
        button.drawButton()

, но когда я это делаю, он говорит: «drawButton () отсутствует1 обязательный позиционный аргумент: 'self' "......... для справки, это мой класс кнопки:

class button:
    global uiX, uiY, uiW, uiH
    def __init__(self, image, x, y, w, h):
        self.image = image
        self.bx = int(uiX + (x * uiW))
        self.by = int(uiY + (y * uiH))
        self.bw = int(w * uiW)
        self.bh = int(h * uiH)

    def drawButton(self):
        pic = pygame.transform.scale(self.image, (self.bw, self.bh))
        win.blit(pic, (self.bx, self.by))
        if ((self.bx < mouse[0] < (self.bx + self.bw)) and (self.by < mouse[1] < (self.by + self.bh))):
            pygame.draw.rect(win, (0, 0, 0,), (self.bx, self.by, self.bw, self.bh))

    def click(self):
        if ((self.bx < mouse[0] < (self.bx + self.bw)) and (self.by < mouse[1] < (self.by + self.bh))):
            print("Whatever the function will be")

Ответы [ 2 ]

4 голосов
/ 18 октября 2019

Это неправильный путь. Класс не знает всех своих экземпляров.

Создайте список кнопок (до основного цикла):

buttons = [
    button(pic, .1, .1, .1, .1)
    button(pic, .25, .1, .1, .1)
    button(pic, .75, .1, .1, .1)
]

Нарисуйте кнопки в цикле for:

while run:
    global mouse
    mouse = pygame.mouse.get_pos()

    for b in buttons:
        b.drawButton()
0 голосов
/ 18 октября 2019

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

Вот минимальный пример:

class Test:
    instances = []

    @classmethod
    def addInstance(cls, instance):
        cls.instances.append(instance)

    @classmethod
    def getInstances(cls):
        return cls.instances

    def __init__(self, arg):
        self.arg = arg
        self.__class__.instances.append(self)


a = Test("Hello")
b = Test("Hellu")
c = Test("Helli")

for instance in Test.getInstances():
    print(instance.arg)

Надеюсь, это поможет.

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