Python Структура проекта - несколько файлов и модулей - PullRequest
1 голос
/ 07 января 2020

Я привык к 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

Если я хочу иметь возможность вызывать функцию checkEvents () внутри файла main.py, я получаю NameError, поскольку он не ' t распознает модуль pygame внутри файла actions.py.

Кажется, я не могу заставить его работать: если я импортирую его в оба файла (что, как я знаю, является оптимальным вариантом), игра запускается, но ключи и ключ выхода не делает ничего. Я полагаю, функция 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()

1 Ответ

1 голос
/ 07 января 2020

Вам нужно только import pygame в actions.py

Другая проблема - 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

И тогда вы получите run в main.py

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