2016-05-13 47 views
1

在開始之前,我知道有很多問題聽起來很像這個問題,但是我的問題有點不同......所以這裏是...在導入的文件中調用主腳本中的函數

由於標題可能建議,我試圖在導入的模塊中調用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

函數是第一類對象蟒蛇。你可以直接把它們作爲參數傳遞 – Alik

+0

說實話,我不完全確定問題是什麼,但我會發表一個答案。但是,Alik是正確的,函數是Python中的第一類對象。 –

回答

3

我想讓它成立,以便我可以傳遞一個命令的字符串參數,並在其上使用eval()命令(python 2.7)。

不,不,不。通過它的功能:

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

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

eval幾乎從來沒有任何工作的正確工具。

如果你不想def INE的功能只是把它作爲一個command參數,你可以使用一個lambda短(單式)功能:

b = module1.Button(command=lambda: do_whatever(some, arguments)) 
+0

謝謝你......我不確定如何做到這一點,我導致的第一件事是eval()命令。我現在可以保留我的這個模塊的所有代碼非常「通用」,現在我可以將它用於我的遊戲。就像我之前說的,謝謝你的幫助:)。 – TacoTree11

相關問題