2016-05-13 7 views
1

Bevor ich beginne, ich weiß, es gibt viele Fragen, die viel wie diese klingen, aber meine Frage ist ein wenig anders ... Also hier ist es ...Rufen Sie eine Funktion aus dem Hauptskript in einer importierten Datei

Da der Titel möglicherweise vorgeschlagen wird, versuche ich eine Funktion, die in meinem main.py-Skript in einem importierten Modul definiert ist, aufzurufen. Diese Situation ist jedoch etwas anders als bei einer zirkulären Importsituation. Ich habe kürzlich viel mit pygame gemacht und entschieden, dass ich ein Modul erstellen würde, das Klassen für Buttons, Text, Sounds usw. enthält. Aber ich möchte, dass diese Datei generisch ist, damit sie mit jedem Spiel oder jeder Anwendung verwendet werden kann, die ich mache. Tasten haben normalerweise Zeichenfunktionen und ähnliches, so dass ich diese Variablen problemlos in die Funktionen überführen kann. Das Problem kommt, wenn ich zu dem Teil komme, an dem ich überprüfen will, ob der Button angeklickt ist, und ob es etwas tut. Ich möchte es so eingerichtet haben, dass ich ein String-Argument für einen Befehl übergeben kann und den eval() -Befehl dafür verwende (Python 2.7). Es wird jedoch der Fehler der Funktion nicht definiert. Ich weiß, warum das so ist, aber ich möchte sehen, ob es etwas gibt, was ich tun kann, um dieses Problem zu umgehen und das Modul so "generisch" wie möglich zu halten. Im Folgenden finden Sie einen grundlegenden Code, mit dem Sie erklären können, was ich tun möchte.

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) 

Der Fehler, wie ich schon Staaten gesagt, dass die Funktion, die ich versuche zu nennen ist nicht definiert. Ich habe einen Workaround dafür gefunden, also möchte ich keine Antworten, die mir sagen, wie ich das ändern kann, so dass es keinen Befehl als Eingabe braucht. Ich möchte es jedoch so machen, dass ich einen Befehl als Argument eingeben kann. Vielleicht gebe ich einen Befehl nicht so ein, wie ich sollte, aber ich würde es gerne so machen, vor allem weil das tkinter-Modul es erlaubt, einen Befehl als Eingabe/Variable einzugeben. Vielleicht gibt es keine Möglichkeit, dies so zu tun, wie ich es mir wünsche, aber ich möchte diesen Code wirklich so wiederverwendbar wie möglich halten, ohne dass Änderungen zwischen den Spielen erforderlich sind, und ich möchte diesen Code nicht jedes Mal in meine Spiele/Anwendungen einfügen mache sie (wie ich schon sagte, das Code-Beispiel, das ich gab, war nur ein Beispiel, mein tatsächlicher Button-Code ist viel größer als das, was ich oben gemacht habe). Wie ich schon sagte, weiß ich, dass es viele Fragen gibt, die genau so sind, aber sie haben mir überhaupt nicht geholfen. Die anderen haben vorgeschlagen, auch importierte Skripte zu verwenden, die Zusatzvariablen und ähnliches enthalten, aber das würde ich lieber nicht tun. Außerdem habe ich eine Workaround, die das Problem vollständig beseitigt, aber es ist nicht annähernd so sauber oder einfach wie dies sein würde.

Wie immer, jede Hilfe wäre willkommen und ich danke Ihnen im Voraus für Ihre Antworten, falls ich nicht sofort zu Ihnen zurückkomme.

+0

Funktionen sind erstklassige Objekte in Python.Sie können sie direkt als Parameter übergeben – Alik

+0

Um ehrlich zu sein, bin ich nicht genau sicher, was die Frage ist, aber ich werde eine Antwort posten. Alik ist jedoch korrekt, Funktionen sind erstklassige Objekte in Python. –

Antwort

3

Ich möchte es eingerichtet haben, so dass ich ein String-Argument für einen Befehl übergeben kann, und verwenden Sie den Befehl eval() darauf (Python 2.7).

Nein, nein, nein. Führen Sie eine Funktion:

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

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

eval fast nie das richtige Werkzeug für jeden Job ist.

Wenn Sie ine einer Funktion def wollen nicht nur passieren sie als command Parameter Sie eine lambda für kurze (Einzelausdruck) Funktionen verwenden können:

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

Danke dafür ... Ich war mir nicht sicher, wie ich das machen sollte und das erste, woran ich geführt wurde, war der Befehl eval(). Ich kann jetzt meinen ganzen Code für dieses Modul sehr "allgemein" halten, und ich werde es jetzt für meine Spiele verwenden können. Wie ich schon sagte, danke für deine Hilfe :). – TacoTree11

Verwandte Themen