В модуле всего одна функция и она требует переменных из главного файла.
Как я понял можно сделать так:
function(par1, par2, par3, par4...] # что делать если параметров 15 ?
Как то стразу можно определить что бы переменные из основной программы использовались в собственном импортируемом модуле, кроме примера выше ?
2) чем отличается directiry от Python package ? или откуда правильно импортировать модуль на выполнение ?
3)
основной файл:
from gfx.stars import stars
import gfx.stars
stars(distanceBetweenTheStar, 10) # с ошибкой: Traceback (most recent call last): File "C:/PycharmProjects/kosmos/main.py", line 36, in <module> stars(distanceBetweenTheStar, 10)
NameError: global name 'random' is not defined
Если скопировать содержимое собственного модуля в основную программу - то все прекрасно работает, изначально так и было - решил сделать функцию отдельным модулем.
Собственно вот код программы целиком, из которой функцию stars я хочу сделать импортируемым модулем:
import pygame import random pygame.init() res = pygame.display.list_modes() width, height = res[0] screen = pygame.display.set_mode(([width, height]), pygame.FULLSCREEN, 32) pygame.display.toggle_fullscreen() font = pygame.font.Font(None, 50) clock = pygame.time.Clock() distanceBetweenTheStar = 1 # расстояние в пикселах между предыдущей и следующей печати звезд white = (255, 255, 255) # цвет звезд lime = (0, 255, 0) # цвет букв black = (0, 0, 0) # фоновый цвет fps = 60 # кадров в секунду allStars = [] # создаем пустой список для всех звезд # функция просчета и печати звезд на экран def stars(distanceBetweenTheStar, speed): # печатаем новые звезды с переодичность заданной в distanceBetweenTheStar if distanceBetweenTheStar == 0: sumStars = random.randint(1, 4) # получаем кол-во звезд в пределах 1-4 preparationStars = [] # создаем пустой список подготовки блока вида [[],[],[]]preparation newStars = [] # создаем пустой список получнех координат для полученых звезд # задаем координаты по Y для полученого блока звезд for i in range(0, sumStars): # в блок заносим случайную координату Y для всех звезд одного блока newStars.append(random.randint(0, height)) # добовляем полученые координаты из блока звезд в список подготовки preparation preparationStars.append(newStars) # добавляем координату X которая идентична для всех звезд всех вновь созданных блоков # и равна правому краю экрана width preparationStars.append([width]) # добавляем speedBlock = random.randint(1, speed) preparationStars.append([speedBlock]) # кидаем все в общий список звезд [координаты Y полученых звезд] [координата X] [скорость] allStars.append(preparationStars) starsCounter = 0 for block in allStars: # вытаскиваем координату звезд блока Y oldCoor = block.pop(1) # отнимаем от координаты Y скорость speed subSpeed = oldCoor[0] - block[1][0] newCoor = subSpeed # вставляем измененную координату Y обратно в блок block.insert(1, [newCoor]) if subSpeed >= 0: # печатаем звезды из изменненого блока for xCor in block[0]: # берем все координаты по Х из текущего блока pygame.draw.rect(screen, white,[newCoor, xCor, 1, 1], 1) starsCounter = starsCounter + 1 else: allStars.remove(block) starCountInScreen = font.render("Stars in screen = " + str(starsCounter), True, lime) screen.blit(starCountInScreen, (400, 400)) running = True distance = distanceBetweenTheStar while running: if distanceBetweenTheStar == 0: distanceBetweenTheStar = distance else: distanceBetweenTheStar = distanceBetweenTheStar - 1 screen.fill(black) stars(distanceBetweenTheStar, 10) pygame.display.flip() clock.tick(fps) for event in pygame.event.get(): if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE: running = False pygame.quit()
Выход из программы: ПРОБЕЛ
То есть тут получается что такие глобальные переменные как width, height и прочие работают в вызываемой функции, а сделав функцию модулем в папке эти переменные уже не видны.
при печати 15 000 - 18 000 точек, точки двигаются уже довольно смазано, то есть быстродействие падает - это особенности pygame или самого python`а ?
python 3.2
модуль выполняется питоном 1 раз