Используйте переменную в другой функции - PullRequest
1 голос
/ 31 марта 2020

Итак, часть этой функции, у меня есть две переменные, color и color_rect, возможно ли использовать эти переменные в другой функции позже. Я попытался поставить глобальный перед ним, однако это привело к синтаксической ошибке или сказать, что variable используется до глобального объявления

Полный код:

def colors():
clock = pygame.time.Clock()

button_1 = pygame.Rect(width/2, (height/10), width/4, 60)
button_1.centerx = width/2
colors = [("White", (255, 255, 255)), ("Red", (255, 0, 0)), ("Green", (0, 255, 0)), ("Blue", (0, 0, 255))]
current_color = 0
color_t, color = colors[current_color]

colors_rect = [("White", (255, 255, 255)), ("Red", (255, 0, 0)), ("Green", (0, 255, 0)), ("Blue", (0, 0, 255))]
current_color_rect = 0
color_t_rect, color_rect = colors[current_color]

text_particle = render_text_speech('pixel.ttf', 30, 'Particle:', (255,255,255), 100, 300, False)
text_colors = render_text_speech('pixel.ttf', 50, 'Colors', (255,255,255), button_1.centerx, button_1.centery, False)
text_color = render_text_speech('pixel.ttf', 30, color_t, color, 180, 300, False)
ball = pygame.Rect(350,200,50,50)
text_rect = render_text_speech('pixel.ttf', 30, 'Ball:', (255,255,255), 310, 300, False)
text_color_rect = render_text_speech('pixel.ttf', 30, color_t_rect, color_rect, 390, 300, False)

particles = []
running = True
while running:
    screen.fill((0,0,0))

    pygame.draw.rect(screen, (135, 206, 235), button_1)
    pygame.draw.rect(screen, color_rect, ball, 3)
    screen.blit(*text_rect)
    screen.blit(*text_particle)
    screen.blit(*text_colors)
    screen.blit(*text_color)
    screen.blit(*text_color_rect)
    textRect = text_color[1]
    textRect_rect = text_color_rect[1]

    particles.append([[150,200],[random.randint(0,20) / 10 - 1, 1], random.randint(4,6)])
    for particle in particles:
        particle[0][0] += particle[1][0]
        particle[0][1] += particle[1][1]
        particle[2] -= 0.1
        particle[1][1] += 0.03
        pygame.draw.circle(screen, color, [int(particle[0][0]), int(particle[0][1])], int(particle[2]))
        if particle[2] <= 0:
            particles.remove(particle)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                running = False
        if event.type == pygame.MOUSEBUTTONDOWN:
            if event.button == 1 and textRect.collidepoint(event.pos):
                current_color += 1
                if current_color >= len(colors):
                    current_color = 0
                color_t, color = colors[current_color]
                text_color = render_text_speech('pixel.ttf', 30, color_t, color, 180, 300, False)

            if event.button == 1 and textRect_rect.collidepoint(event.pos):
                current_color_rect += 1
                if current_color_rect >= len(colors_rect):
                    current_color_rect = 0
                color_t_rect, color_rect = colors_rect[current_color_rect]
                text_color_rect = render_text_speech('pixel.ttf', 30, color_t_rect, color_rect, 390, 300, False)


    pygame.display.update()
    clock.tick(60)

Две переменные color и color_rect. Заметьте, я сказал переменную color, а не colors.

Ответы [ 2 ]

0 голосов
/ 31 марта 2020

Самым простым (и, мне кажется, самым чистым способом) было бы сделать эту функцию методом класса и сохранить эти переменные как переменные-члены, то есть self.color и self.color_rect. Затем, если вы используете один и тот же экземпляр класса, эти переменные будут одинаковыми во всех функциях этого класса.

Подробнее о Python классах можно узнать здесь .

0 голосов
/ 31 марта 2020

Переместите ваши переменные за пределы / выше def. Это меняет их область действия, поэтому они могут использоваться во всех функциях в одном и том же .py кодовом файле.

color = ()

def method_that_uses_color():
    do_something(color)

def colors():
    clock = pygame.time.Clock()

    button_1 = pygame.Rect(width/2, (height/10), width/4, 60)
    button_1.centerx = width/2
    colors = [("White", (255, 255, 255)), ("Red", (255, 0, 0)), ("Green", (0, 255, 0)), ("Blue", (0, 0, 255))]
    current_color = 0
    color_t, color = colors[current_color]
    [.......]

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

def __init__():
    color = colors()
    do_something(color)

def method_that_uses_color(color):
    do_something(color)

def colors():
    clock = pygame.time.Clock()

    button_1 = pygame.Rect(width/2, (height/10), width/4, 60)
    button_1.centerx = width/2
    colors = [("White", (255, 255, 255)), ("Red", (255, 0, 0)), ("Green", (0, 255, 0)), ("Blue", (0, 0, 255))]
    current_color = 0
    color_t, color = colors[current_color]
    [.......]
    return color
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...