Python项目结构多个文件和模块

2024-03-29 09:27:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经习惯了PHP,全局变量在整个项目中都是可用的,包含/需要一个PHP文件就像是在那个地方“注入”它的代码行:整个事情都会被“视”为一个文件,所有变量都会被本能地访问

Python以一种不同的方式工作,我想知道一些好的做法,以便通过将大型项目拆分为文件使其更易于管理

假设我有一个名为configs.py的文件,它类似于:

FRAME_DURATION = int(1000 / 25)
SCREEN_SIZE = 500

LIGHT_GREY  = (190,190,190)
RED = (255,0,0)
GREEN = (0,255,0)
YELLOW = (255,255,0)
#etc...

然后,在Main.py文件中,我可以执行以下操作:

import pygame
from configs import *

pygame.init()   
SCREEN = pygame.display.set_mode((SCREEN_SIZE, SCREEN_SIZE),1)
SCREEN.fill(LIGHT_GREY)

run = True
while run:
    pygame.time.delay(FRAME_DURATION )

    #HERE I'M SUPPOSED TO CHECK THE KEYBOARD AND MOUSE EVENTS

    pygame.display.update()

pygame.quit()

这很好,因为我们只处理变量。但是,如果我想将事件侦听器放到另一个单独的文件中,我会遇到一些“麻烦”。假设我想要一个包含所有函数的文件。我将其命名为actions.py,它包含以下函数:

def checkEvents():
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                run = False
            if event.key == pygame.K_r:
                pass

如果我希望能够在main.py文件中调用checkEvents()函数,我会得到一个NameError,因为它无法识别actions.py文件中的pygame模块

我似乎无法让它工作:如果我在两个文件上导入它(我知道这是sup-optimal),游戏会启动,但键和退出键什么也不做。我猜checkEvents()函数正在侦听pygame的另一个实例

无论如何,我想知道是否有一种方法使模块“全球可用”。。。在主文件中导入一次,并在整个项目中使用它,包括在其他导入的自定义模块中

最终结果应如下所示:

import pygame
from configs import *
import actions

pygame.init()   
SCREEN = pygame.display.set_mode((SCREEN_SIZE, SCREEN_SIZE),1)
SCREEN.fill(LIGHT_GREY)

run = True
while run:
    pygame.time.delay(FRAME_DURATION )

    actions.checkEvents()

    pygame.display.update()

pygame.quit()

Tags: 文件函数runpyimporteventactionssize
1条回答
网友
1楼 · 发布于 2024-03-29 09:27:05

您只需在actions.py中使用import pygame

另一个问题是run,您必须从checkEvents()返回它

import pygame 

def checkEvents():
    run = True # local variable with default value before all tests

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False # set local variable

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                run = False # set local variable
            if event.key == pygame.K_r:
                pass

    return run # return local value to main code

然后在{}中得到{}

import pygame
from configs import *
import actions

pygame.init()   
SCREEN = pygame.display.set_mode((SCREEN_SIZE, SCREEN_SIZE),1)
SCREEN.fill(LIGHT_GREY)

run = True
while run:
    pygame.time.delay(FRAME_DURATION )

    run = actions.checkEvents() # get result from function and assign to `run`

    pygame.display.update()

pygame.quit()

相关问题 更多 >