好的,所以我知道这看起来很愚蠢,但是我目前正在使用多个文件制作游戏,一个主要的游戏可以接收其他文件中的所有变量并以某种方式使用它们。我正在使用:
from SPRITES import *
要获取这些变量,但是现在我需要一个只能在SPRITES中的MAIN中定义的变量(因为玩家所站在的平台位于main中,这需要更改sprite中定义的控件),但是,如果我只是做一个
from MAIN import *
这似乎完全断开了连接。请帮助
编辑:好的,目前我的文件太大了,无法在此处发布所有代码,但我将尝试在此处发布相关内容(第一次在此处)。这是主“ titleMAIN”文件的开始
import pygame as pg
import random
from titleSETTING import *
from titleSPRITE import *
cont = ("green")
class Game:
def __init__(self):
# initialize game window, etc
pg.init()
,依此类推 从Game类中调用SPRITES文件中的Player类-我需要能够在Player类中使用'cont'变量:
def new(self):
# start a new game
cont = ("green")
...
self.player = Player(self)
self.all_sprites.add(self.player)
这是我尝试从SPRITES文件中调用MAIN文件的地方:
from titleSETTING import *
...
class Player(pg.sprite.Sprite):
def __init__(self, game):
对不起,我第一次来这儿,对我来说还是个新手,无论我多么喜欢它。通过文件顺便说一句,我的意思是同一文件夹中的不同python(.py)文件-使用IDLE作为IDE,这很糟糕,但这就是我所得到的
编辑2:感谢您的回答-我意识到,最好只制作一个文件而不是两个文件,以免使代码过于复杂,所以我现在就以这种思维方式进行工作
答案 0 :(得分:1)
这对您不起作用的主要原因是圆形进口有问题。如果某个文件A导入了其他文件B,则您不希望B导入A(甚至通过其他一些文件间接导入)。
因此,为了使其正常工作,我将main分为两个。
顺便说一句,使用全局变量(和import *)往往会使程序难以阅读。与其考虑一堆全局变量,不如考虑一个具有需要作为字段的值的全局变量。代替导入*,请考虑显式导入(仅import sprites
,然后是sprites.foo
)。
main.py:
from sprites import *
from config import *
print "Hello from main. main_value is: ", main_value
print "sprite value is: ", sprite_value
do_sprite()
sprites.py:
from config import *
sprite_value=10
def do_sprite():
print "main value is: ", main_value
config.py:
main_value=5
答案 1 :(得分:0)
尽管在技术上可行(使用一些晦涩的Python功能),但您要实现的目标既不容易,也不是一个好主意。
请注意,您做过from moduleX import *
的事实并没有使moduleX
中定义的变量{或main
神奇地在import
中可用。声明)。它的作用是,它会在当前模块中创建具有相同名称的 new 变量,并使它们指向与模块X中相同的对象在执行导入的时刻 。假设某个名为A
的模块中有X
,它被初始化为“ foo”。您完成了import * from X
,现在print(A)
将显示foo
。如果您现在从X
调用一个函数并将其从A
更改为bar
,则它不会影响您在main
中拥有的内容-仍然是对象{{1 }}。同样,如果您主要执行foo
,则a="baz"
中引用X
的函数仍会看到A
的该变量副本。
如果您需要一些数据可用于一个以上的模块,则最好安排所有共享数据存储在某个公共对象中,并在所有模块中对该对象具有易于访问的引用需要共享数据。以下是该物品的可能选择,选择适合您口味的物品:
它可以是仅用于保留公共变量的模块,比方说它被称为X
或data
(有一个空文件common
)。将其导入所需的任何位置,并将变量设置为data.py
或根据需要使用它们,例如data.A = "something"
。
它可以是您自己定义的类的实例, 例如:
print (data.A)
现在,使用class data_class(object):
# set initial values
var1 = 10
A = "foo"
创建它的一个实例,并将其传递给需要它的每个模块。例如,将其定义在一个模块中,然后从其他任何地方导入。
data = data_class()
,等等。