繁体   English   中英

为什么我不断收到此错误以及如何解决它

[英]why do i keep getting this error and how do i solve it

所以我有这个庞大的 python 代码,但我无法让它工作。 它一直在说:

UnboundLocalError:分配前引用的局部变量“secondnum”

这个问题现在实际上已经解决了,感谢您的帮助,但该程序似乎仍然无法正常工作。 我没有收到任何错误,但它应该是秒表,但我无法更改精灵的外观。

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

请帮忙。 请对我有点耐心,我只有 14 岁

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()

请阅读https://stackoverflow.com/help/minimal-reproducible-example关于提出更好的问题。 此外,包括 python 版本和询问错误时的完整回溯。

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

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 中,一个月后,消息更改为“无法访问与值无关的局部变量 's'”,我们希望更清楚。

Python works that way, that if Python find a variable being assign in some function it defines this variable as local and stops looking for it to be assign somewhere out of the function. 要修复它,您最好在 function 背景中设置第二个全局变量。

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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM