我有大量的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()
请阅读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 中,消息更改为“无法访问未与值关联的局部变量”,我们希望这一点更清晰。
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()