我的 pygame 秒表中的“UnboundLocalError:赋值前引用的局部变量‘secondnum’”

问题描述 投票:0回答:2

我有大量的Python代码,应该显示秒表,但它不断引发以下错误:

UnboundLocalError: local variable 'secondnum' referenced before assignment

尽管这个问题现在已经解决了,但程序似乎仍然无法正常工作。我没有收到任何错误,但我无法更改精灵的外观。

我试着用谷歌搜索一下,但似乎没有人遇到和我一样的问题。

import pygame, sys
import time
import threading

secondnum = "0"
tensecondnum = "0"
minutenum = "0"
tenminutenum = "0"

secondimage = {"0": "0.png", 1: "1.png", 2: "2.png", 3: "3.png", 4: "4.png", 5: "5.png", 6:"6.png", 7: "7.png"
}
tensecondimage = {"0": "0.png"
}
minuteimage = {"0": "0.png"
}
tenminuteimage = {"0": "0.png"
}

def background():
    while True:
        global secondnum
        global tensecondnum
        global minutenum
        global tenminutenum
        time.sleep(1)
        secondnum = "1"
    
def foreground():
    global numbers1_group
    global numbers2_group
    global numbers3_group
    global numbers4_group
    global screen
    class Colon(pygame.sprite.Sprite):
        def __init__(self, pos_x, pos_y):
            super().__init__()
            self.image = pygame.image.load("kolon.png")
            self.rect = self.image.get_rect()
            self.rect.center = [pos_x, pos_y]
            
    class Numbers1(pygame.sprite.Sprite):
        def __init__(self, pos_x, pos_y, number):
            super().__init__()
            self.image = pygame.image.load(number)
            self.rect = self.image.get_rect()
            self.rect.center = [pos_x, pos_y]

    class Numbers2(pygame.sprite.Sprite):
        def __init__(self, pos_x, pos_y, number):
            super().__init__()
            self.image = pygame.image.load(number)
            self.rect = self.image.get_rect()
            self.rect.center = [pos_x, pos_y]

    class Numbers3(pygame.sprite.Sprite):
        def __init__(self, pos_x, pos_y, number):
            super().__init__()
            self.image = pygame.image.load(number)
            self.rect = self.image.get_rect()
            self.rect.center = [pos_x, pos_y]

    class Numbers4(pygame.sprite.Sprite):
        def __init__(self, pos_x, pos_y, number):
            super().__init__()
            self.image = pygame.image.load(number)
            self.rect = self.image.get_rect()
            self.rect.center = [pos_x, pos_y]

    # General setup
    pygame.init()
    clock = pygame.time.Clock()

    # Game Screen
    screen_width = 700
    screen_height = 350
    screen = pygame.display.set_mode((screen_width,screen_height))
    background = pygame.image.load("BG.png")
    pygame.mouse.set_visible(True)

    # Colon
    colon = Colon(350, 175)
    colon_group = pygame.sprite.Group()
    colon_group.add(colon)

    # Numbers1
    numbers1 = Numbers1(140, 175, tenminuteimage["0"])
    numbers1_group = pygame.sprite.Group()
    numbers1_group.add(numbers1)
    

    # Numbers2
    numbers2 = Numbers2(280, 175, minuteimage["0"])
    numbers2_group = pygame.sprite.Group()
    numbers2_group.add(numbers2)

    # Numbers3
    numbers3 = Numbers3(420, 175, tensecondimage["0"])
    numbers3_group = pygame.sprite.Group()
    numbers3_group.add(numbers3)

    # Numbers4
    numbers4 = Numbers4(560, 175, secondimage[secondnum])
    numbers4_group = pygame.sprite.Group()
    numbers4_group.add(numbers4)

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()

        pygame.display.flip()
        screen.blit(background,(0,0))
        colon_group.draw(screen)
        numbers1_group.draw(screen)
        numbers2_group.draw(screen)
        numbers3_group.draw(screen)
        numbers4_group.draw(screen)
        clock.tick(60)

b = threading.Thread(name='background', target=background)
f = threading.Thread(name='foreground', target=foreground)

b.start()
f.start()
python multithreading pygame variable-assignment clock
2个回答
1
投票

请阅读https://stackoverflow.com/help/minimal-reproducible-example了解如何提出更好的问题。另外,在询问错误时,请包括 python 版本和complete回溯。

无论如何,下面显示了您所做的事情和解决方案。

s = 0
def bad():
    s = s+1

def good():
    global s
    s = s+1

good()
bad()

打印

Traceback (most recent call last):
  File "<pyshell#13>", line 1, in <module>
    bad()
  File "<pyshell#7>", line 2, in bad
    s = s+1
UnboundLocalError: local variable 's' referenced before assignment

在一个月后的 3.11 中,消息更改为“无法访问未与值关联的局部变量”,我们希望这一点更清晰。


0
投票

Python 就是这样工作的,如果 Python 发现一个变量在某个函数中被赋值,它就会将该变量定义为局部变量,并停止寻找将其分配到函数之外的某个位置。要解决这个问题,您最好在函数背景内将 secondarynum 设置为全局。

import pygame, sys
import time
import threading

global tensecondnum
global minutenum
global tenminutenum
secondnum = "0"
tensecondnum = "0"
minutenum = "0"
tenminutenum = "0"

secondimage = {"0": "0.png", 1: "1.png", 2: "2.png", 3: "3.png", 4: "4.png", 5: "5.png", 6:"6.png", 7: "7.png"
}
tensecondimage = {"0": "0.png"
}
minuteimage = {"0": "0.png"
}
tenminuteimage = {"0": "0.png"
}




def background():
    while True:
        global secondnum
        time.sleep(1)
        secondnum = str(int(secondnum) + 1)
    
def foreground():
    class Colon(pygame.sprite.Sprite):
        def __init__(self, pos_x, pos_y):
            super().__init__()
            self.image = pygame.image.load("kolon.png")
            self.rect = self.image.get_rect()
            self.rect.center = [pos_x, pos_y]
            
    class Numbers1(pygame.sprite.Sprite):
        def __init__(self, pos_x, pos_y, number):
            super().__init__()
            self.image = pygame.image.load(number)
            self.rect = self.image.get_rect()
            self.rect.center = [pos_x, pos_y]

    class Numbers2(pygame.sprite.Sprite):
        def __init__(self, pos_x, pos_y, number):
            super().__init__()
            self.image = pygame.image.load(number)
            self.rect = self.image.get_rect()
            self.rect.center = [pos_x, pos_y]

    class Numbers3(pygame.sprite.Sprite):
        def __init__(self, pos_x, pos_y, number):
            super().__init__()
            self.image = pygame.image.load(number)
            self.rect = self.image.get_rect()
            self.rect.center = [pos_x, pos_y]

    class Numbers4(pygame.sprite.Sprite):
        def __init__(self, pos_x, pos_y, number):
            super().__init__()
            self.image = pygame.image.load(number)
            self.rect = self.image.get_rect()
            self.rect.center = [pos_x, pos_y]

    # General setup
    pygame.init()
    clock = pygame.time.Clock()

    # Game Screen
    screen_width = 700
    screen_height = 350
    screen = pygame.display.set_mode((screen_width,screen_height))
    background = pygame.image.load("BG.png")
    pygame.mouse.set_visible(True)

    # Colon
    colon = Colon(350, 175)
    colon_group = pygame.sprite.Group()
    colon_group.add(colon)

    # Numbers1
    numbers1 = Numbers1(140, 175, tenminuteimage["0"])
    numbers1_group = pygame.sprite.Group()
    numbers1_group.add(numbers1)

    # Numbers2
    numbers2 = Numbers2(280, 175, minuteimage["0"])
    numbers2_group = pygame.sprite.Group()
    numbers2_group.add(numbers2)

    # Numbers3
    numbers3 = Numbers3(420, 175, tensecondimage["0"])
    numbers3_group = pygame.sprite.Group()
    numbers3_group.add(numbers3)

    # Numbers4
    numbers4 = Numbers4(560, 175, secondimage[secondnum])
    numbers4_group = pygame.sprite.Group()
    numbers4_group.add(numbers4)

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()

        pygame.display.flip()
        screen.blit(background,(0,0))
        colon_group.draw(screen)
        numbers1_group.draw(screen)
        numbers2_group.draw(screen)
        numbers3_group.draw(screen)
        numbers4_group.draw(screen)
        clock.tick(60)

b = threading.Thread(name='background', target=background)
f = threading.Thread(name='foreground', target=foreground)

b.start()
f.start()
© www.soinside.com 2019 - 2024. All rights reserved.