class mainmenu(object):
def __init__(self, screen):
pygame.init()
self.screen = screen
def button(self, rect, radius=0, action=None):
click = pygame.mouse.get_pressed()
if rect.collidepoint(pygame.mouse.get_pos()):
color = (141,182,205)
if click[0] == 1 and action != None:
action()
else:
color = (28,134,238)
pygame.draw.rect(self.screen, color, rect, border_radius = radius)
def menu(self):
screenw = self.screen.get_width()
screenh = self.screen.get_height()
mid_w = screenw/2
mid_h = screenh/2
btn_start = pygame.Rect(mid_w-150,mid_h*3/5,300,100)
self.button(btn_start, 50, self.start)
def start():
return 'start'
Я не даю никаких аргументов в start()
, но я ловлю эту ошибку
TypeError: start() takes 0 positional arguments but 1 was given
просто добавь self
в start()
лайк start(self)
self.start()
— это сокращение от start(self)
. Таким образом, вы не можете передать метод, привязанный к объекту, вам придется передать свободную функцию (или статический метод). Все методы класса ожидают аргумент self
(ваш start
метод не должен работать).
class Example:
def method(self): # Takes `self` as parameter
pass
Вместо этого вы должны создать статический метод, который не принимает никаких параметров:
class Example:
@staticmethod
def my_static_method():
# Doesn't take `self` as parameter, which means you cannot use
# `self` in this method.
pass
или отдельная функция, которая вообще не привязана к классу.
def my_function():
pass
Их можно передавать как функции, не принимающие никаких аргументов.
В вашем конкретном случае вы можете сделать start
статическим методом, так как он не использует self
или бесплатную функцию:
class MainMenu:
def __init__(self, screen):
pygame.init()
self.screen = screen
def button(self, rect, radius=0, action=None):
click = pygame.mouse.get_pressed()
if rect.collidepoint(pygame.mouse.get_pos()):
color = (141,182,205)
if click[0] == 1 and action != None:
action()
else:
color = (28, 134, 238)
pygame.draw.rect(self.screen, color, rect, border_radius=radius)
def menu(self):
screen_width = self.screen.get_width()
screen_height = self.screen.get_height()
mid_width = screen_width / 2
mid_height = screen_height / 2
btn_start = pygame.Rect(mid_width-150, mid_height*3/5, 300, 100)
# Do this to call the static method.
self.button(btn_start, 50, MainMenu.start)
# Or do this to call the free standing function.
self.button(btn_start, 50, start)
@staticmethod
def start():
return 'start'
def start():
return 'start'
self.start()
— это сокращение отstart(self)
. Таким образом, вы не можете передать метод, привязанный к объекту, вам придется передать свободную функцию (или статический метод). Если вы посмотрите наstart
, вы увидите, что он ожидаетself
в качестве параметра.