2016-05-02 8 views
1

Ich habe ein Spiel erstellt. Es funktionierte perfekt, also dachte ich, ich würde einen Bildschirm hinzufügen, um die Farbe der Kugel zu ändern. Ich habe das Fenster erstellt, dem ich die Variablen zugewiesen habe, die ich brauchte, aber ich erhalte immer einen Fehler, der besagt, dass die Variable nicht definiert wurde, aber die anderen Variablen unterhalb der Variable, die definiert wurde und von der gleichen "Shop" -Funktion kam definiert. und wenn ich das normale los werde und nur die FireGun und LaserGun FireGun nicht definiert ist. Es ist schwer zu erklären. schau dir also den Code an, den ich oft durchgespielt habe, und sieh zu, ob du Fehler auslesen kannst.globale Variable nicht übergeben, sagt es nicht erkannt?

from tkinter import * 

def MainMenu(): 
    self = Tk() 

    self.btnShops = Button(text ="Shop") 
    self.btnShops.pack() 

    def startShops(event): 
     self.destroy() 
     Shop() 


    self.btnShops.bind('<Button>',startShops) 



    self.geometry("830x700") 
    self.title("Space Assault") 
    self.configure(bg="black") 



def Shop(): 
    self = Tk() 


    normal = 1 
    fire = 0 
    laser = 0 

    def FireGun(event): 
     global fire 
     global normal 
     global laser 
     fire = 1 
     normal = 0 
     laser = 0 

    def LaserGun(event): 
     global laser 
     global fire 
     global normal 
     laser = 1 
     fire = 0 
     normal = 0 


    self.btnfireGun = Button(text="Fire Gun") 
    self.btnfireGun.pack() 
    self.btnlaser = Button(text = "Laser Gun") 
    self.btnlaser.pack() 
    self.btnMainMenu = Button(text="Main Menu") 
    self.btnMainMenu.pack() 


#Bind 
    self.btnfireGun.bind('<Button>',FireGun) 
    self.btnlaser.bind('<Button>', LaserGun) 
    self.btnMainMenu.bind('<Button>',StartMainMenu) 

#Frame settings 
    self.geometry("830x700") 
    self.title("Space Assault Shop") 
    self.configure(bg="black") 

def singleplayergame(): 

    def Shoot(event): 
     global normal 
     global fire 
     global laser 

     self.shot = Canvas(bg="black",highlightthickness=0,width=10,height=10) 
     self.shot.place(x=shotXpos,y=shotYpos) 

     if normal == 1: 
      self.shot.create_oval(0,0,10,10,fill=random.choice(COLORS)) 
     elif fire == 1: 
      self.shot.create_oval(0,0,10,10,fill='red') 
     elif laser == 1: 
      self.shot.create_oval(0,0,10,10,fill='blue') 

MainMenu() 

Wenn ich auf den FireGun-Knopf geklickt habe, funktionieren die Kugeln gut und sie kommen rot wie normal heraus. Aber wenn ich es "normal" will, feuert es gar nichts. hoffe das macht Sinn. Ich denke, es hat etwas mit der globalen Verlangsamung zu tun, aber ich bin wirklich auf diesem hier festgefahren.

Antwort

2

Viele Sachen gehen los.

Sie sollten solche Funktionen nicht verschachteln. Wenn Sie versuchen, Daten/Struktur zu kapseln, dann verwenden Sie einfach eine Klasse. Du scheinst einen benutzen zu wollen, indem du Tk() selbst nennst und dich überall anrufst. Das ist wirklich nur eine Reihe von Attributen zu Tk setzen.

Sie erstellen mehrere Instanzen von Tk(). Wenn Sie neue Fenster möchten, verwenden Sie das Widget Toplevel(). Ansonsten verwenden Sie einfach pack_forget/grid_forget, um das gewünschte Frame/Widget im Wesentlichen zu verbergen und die anderen mit pack/grid zu verbergen, um sie im Raster zu ersetzen.

Keine Notwendigkeit mehrere Tk() Instanzen herumlaufen zu lassen.

Sie rufen nie mainloop.

Sie rufen global auf Ihre Variablen, die Sie nicht restrukturieren können. Wenn Sie Globals 9/10 verwenden, haben Sie eine XY problem. Sie sind wirklich nicht einmal global. Sie sind lokal für die Funktion (en), die Sie verschachtelt haben. Sie können nonlocal verwenden, wenn Sie diese Struktur wirklich wollen. Wenn Sie sich für eine solche Struktur entscheiden, verwenden Sie einfach eine Klasse und behalten Sie diese als Attribute bei.

Sie müssen bind nicht für alle Ihre Tasten verwenden, nur um eine Funktion beim Klicken aufzurufen. Dies ist, was das Argument command ist.

1

Das Definieren einer globalen Variablen innerhalb einer Funktion teilt dieser Funktion einfach mit, dass sie die angegebene global Variable mit dem gleichen Namen verwendet. Es weist keine Variable in sich selbst zu. Wenn Sie Python3 verwenden, können Sie innerhalb der eingebetteten Funktionen in der shop-Funktion die Deklaration nonlocal anstelle von global verwenden, um den integrierten Funktionen mitzuteilen, dass sie die lokalen Funktionen shop verwenden sollen.

Ich sehe, dass Sie die Variablen in der singleplayergame Funktion verwenden möchten, also erwägen Sie, diese Variablen außerhalb aller Funktionen zu definieren und sie dann über die global Deklaration zu importieren.

In diesem Fall die normal, fire und laser Variablen außerhalb der shop Funktion bewegen sollte es tun.

Hoffe, das hilft und hier sind einige Links, um mit dem Umfang in Python zu helfen!

George

Python scoping: understanding LEGB

Setting a global variable in a function