首页 > 解决方案 > 为什么循环时程序中没有定义屏幕?

问题描述

当我尝试在鼠标坐标处画一个圆圈时,我使用以下代码:

def main():
    screen.clear()
    mx, my = pygame.mouse.get_pos()
    screen.draw.circle((mx, my), 30, (255, 255, 255))

一次有效,但是当我将其更改为如下所示时:

def main():
    screen.clear()
    mx, my = pygame.mouse.get_pos()
    screen.draw.circle((mx, my), 30, (255, 255, 255))
    screen.clear()
while (1):
    main()

它引发了这个错误:

Traceback (most recent call last):
  File "/usr/lib/python3.7/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib/python3.7/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/usr/lib/python3/dist-packages/pgzero/__main__.py", line 3, in <module>
    main()
  File "/usr/lib/python3/dist-packages/pgzero/runner.py", line 92, in main
    exec(code, mod.__dict__)
  File "virus-simulation!.py", line 6, in <module>
    main()
  File "virus-simulation!.py", line 2, in main
    screen.clear()
NameError: name 'screen' is not defined

发生这种情况有什么原因吗?

标签: pythonpygame

解决方案


我不知道你的屏幕是在哪里定义的,所以我不能确定是什么导致了这个问题。这是基于您的示例的一些工作代码。它在鼠标位置绘制一个圆圈。

import pygame

pygame.init()

class CDraw():
   def __init__(self, sc): 
       self.scrn = sc
   def circle(self, p, r, c):
       pygame.draw.circle(self.scrn, c, p, r)
       
class CScreen():        
   def __init__(self):
       self.scrn = pygame.display.set_mode((400,400))
       self.draw = CDraw(self.scrn)
   def clear(self):
       self.scrn.fill((0,200,0))

screen = CScreen()

def main():
    screen.clear()
    mx, my = pygame.mouse.get_pos()
    screen.draw.circle((mx, my), 30, (255, 255, 255))
    #screen.clear()  # will remove everything
    for event in pygame.event.get():   # needed for os events
        if event.type == pygame.QUIT:
            exit()
    pygame.display.update()  # needed to do screen update
    
while (1):
    main()

推荐阅读