在我开始之前,我知道有很多问题听起来很像这个问题,但我的问题有点不同......所以这就是......
正如标题所暗示的那样,我试图在导入的模块中调用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模块允许你输入命令作为输入/变量。也许没有办法像我希望的那样这样做,但我真的希望尽可能保持这些代码的可重用性,游戏之间不需要更改,我宁愿不必每次都将这些代码放入我的游戏/应用程序中制作它们(就像我在代码示例之前所说的那样只是一个例子,我的实际按钮代码比我上面做的要大得多)。就像我之前说过的那样,我知道有很多问题就像这个问题一样,但是对于这个问题他们根本没有帮助我。其他人建议使用导入的脚本,其中包含附加变量等,但我宁愿不这样做。此外,我有一个彻底摆脱问题的解决方法,但它不像这样那么简洁或容易。
与往常一样,任何帮助都会受到赞赏,并提前感谢您的答案,以防我不立即回复您。
答案 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