从导入文件中的主脚本调用函数

时间:2016-05-13 02:01:36

标签: python python-2.7

在我开始之前,我知道有很多问题听起来很像这个问题,但我的问题有点不同......所以这就是......

正如标题所暗示的那样,我试图在导入的模块中调用main.py脚本中定义的函数。但是,这种情况与循环导入情况略有不同。我最近在pygame上做了很多,并且决定我要制作一个包含按钮,文本,声音等类的模块。但我希望这个文件是通用的,因此它可以用于我制作的任何游戏或应用程序。按钮通常有绘图功能和类似的东西,所以我可以轻松地将这些变量传递给函数而没有问题。当我到达我要检查按钮是否被点击的部分,以及它是否做某事时,问题就来了。我想设置它,以便我可以为命令传入一个字符串参数,并在其上使用eval()命令(python 2.7)。但是,它会抛出未定义函数的错误。我知道为什么会这样,但我想知道我是否可以采取任何措施来解决这个问题,以使模块尽可能“通用”。下面是一组基本代码,用于帮助解释我想要做的事情。

module1.py

class Button(object):
    def __init__(self,x=0,y=0,image=None,command=""):
        self.x = x
        self.y = y
        self.image = image
        self.command = command

"""
Image this part filled with draw commands and stuff...
These functions work perfectly fine
"""

#Now here is the issue - local is mouse position
    def checkClick(self, local):
        #If statments here to determine if mouse over button and
        #if mouse is clicked... The part below fails
        eval(self.command)

main.py

import module1
import pygame

def quitgame():
    pygame.quit()
    quit()

local = pygame.mouse.get_pos()
b = module1.Button(command="quitgame")

#At this point lets assume that the mouse is overtop the button and the
#following function in the button will run
b.checkClick(local)

如前所述,错误表明我尝试调用的函数未定义。我找到了一个解决方法,所以我不希望答案告诉我如何更改它,因此它不会将命令作为输入。但是,我想这样做,所以我可以输入一个命令作为参数。也许我没有按照我应该的方式输入命令,但我想这样做,特别是因为tkinter模块允许你输入命令作为输入/变量。也许没有办法像我希望的那样这样做,但我真的希望尽可能保持这些代码的可重用性,游戏之间不需要更改,我宁愿不必每次都将这些代码放入我的游戏/应用程序中制作它们(就像我在代码示例之前所说的那样只是一个例子,我的实际按钮代码比我上面做的要大得多)。就像我之前说过的那样,我知道有很多问题就像这个问题一样,但是对于这个问题他们根本没有帮助我。其他人建议使用导入的脚本,其中包含附加变量等,但我宁愿不这样做。此外,我有一个彻底摆脱问题的解决方法,但它不像这样那么简洁或容易。

与往常一样,任何帮助都会受到赞赏,并提前感谢您的答案,以防我不立即回复您。

1 个答案:

答案 0 :(得分:3)

  

我想设置它以便我可以为命令传入一个字符串参数,并在其上使用eval()命令(python 2.7)。

不,不,不。传递一个功能:

# In main.py
b = module1.Button(command=quitgame)

# In module1.py
def checkClick(self, local):
    ...
    self.command()

eval几乎不是任何工作的正确工具。

如果您不希望def使用command函数将其作为lambda参数传递,则可以使用b = module1.Button(command=lambda: do_whatever(some, arguments)) 作为简短(单表达式)函数:

MdIcon