2016-06-21 4 views
0

Ich möchte meine "Quit" -Taste, um das Fenster zu schließen und das Programm zu beenden, egal, wenn es gedrückt wird. Momentan funktioniert es, wenn es zuerst gedrückt wird, aber wenn die "Roll" -Taste zuerst gedrückt wird, dann schließt die "Quit" -Taste das Fenster nicht. Ich bin ein Anfänger-Programmierer, also bin ich mir sicher, dass es nicht verwandte Probleme mit meinem Code gibt, aber danke im Voraus, wenn Sie mir mit diesem speziellen Problem helfen können!Python Tkinter - Quit Taste funktioniert nicht, wenn andere Taste zuerst geklickt

from Tkinter import * 
from random import randint 

class Application(Frame): 

def displayBoard(self): 
    self.canvas1 = Canvas(self, width=200, height=200) 
    self.canvas1.pack() 
    self.canvas2 = Canvas(self, width=200, height=200) 
    self.canvas2.pack() 

    self.roll_button = Button(self, text="Roll the Dice", command=self.roll) 
    self.roll_button.pack() 

    self.clear = Button(self, text="Clear", command=self.resetBoard) 
    self.clear.pack() 

    self.quit = Button(self, text="Quit", command=self.quit) 
    self.quit.pack() 


def __init__(self, master=None): 
    Frame.__init__(self, master) 
    Pack.config(self) 


def roll(self): 
    die1 = faces[(randint(1,6)-1)] 
    die2 = faces[(randint(1,6)-1)] 
    self.resetBoard() 
    self.canvas1.create_text(20, 30, anchor=W, text=die1) 
    self.canvas1.pack() 

    self.canvas2.create_text(20, 30, anchor=W, text=die2) 
    self.canvas2.pack() 


def resetBoard(self): 
    self.canvas1.destroy() 
    self.canvas2.destroy() 
    self.clear.destroy() 
    self.roll_button.destroy() 
    self.quit.destroy() 
    self.displayBoard() 

def quit(self): 
    self.master.quit() 
    self.master.destroy() 

master = Tk() 


    face1 = """\n 
__________ 
|     | 
|     | 
|  ()  | 
|     | 
|__________| 
""" 

face2 = """\n 
__________ 
|     | 
|   ()  | 
|     | 
| ()   | 
|__________| 
""" 
face3 = """ \n 
__________ 
|     | 
|   () | 
|  ()  | 
| ()   | 
|__________| 
""" 


face4 = """\n 
__________ 
|     | 
| () ()  | 
|     | 
| () ()  | 
|__________| 
""" 

face5 = """ \n 
__________ 
|     | 
| () () | 
|  ()  | 
| () () | 
|__________| 
""" 

face6 = """ \n 
__________ 
|     | 
| () () | 
| () () | 
| () () | 
|__________| 
""" 

faces = [face1, face2, face3, face4, face5, face6] 

dicegame = Application() 
dicegame.displayBoard() 
dicegame.mainloop() 
+0

Versuchen Sie 'beenden Umbenennen()' Funktion ; Wenn Sie versuchen, das Board zurückzusetzen, kann es sein, dass "self.quit" ein 'Button' ist und den Button als seine Aktion aufruft. Könnte eine interne tote Referenz werfen, die nur zum Schweigen gebracht wird oder so. – Delioth

+0

@Delioth: Genau das passiert. 'self.quit' bedeutet verschiedene Dinge zu verschiedenen Zeiten in diesem Code. –

Antwort

0

(Für spätere Programmierer mit dieser Frage, die hier stolpern)

Das Problem dabei ist, Sie haben die Funktion self.quit und auch eine Schaltfläche self.quit. Python wird keine Namen überladen - self.quit nach der Initialisierung ist eine Funktion, aber nach dem ersten Mal self.resetBoard aufrufen, ist die Schaltfläche mit self.quit verbunden - Ihre Referenz auf die Funktion zu zerstören.

Die Lösung ist, nur eine von ihnen umzubenennen, und denken Sie daran, Namenskonflikte zu vermeiden. Einige pythonic Möglichkeiten umfassen:

  • Interne Funktionen können mit einem führenden self._quit() unterstreichen genannt werden
  • Vermeidung Namespace Auseinandersetzungen mit builtins (quit() ist builtin) wird in der Regel mit einem nachgestellten getan unterstreichen self.quit_()
  • Weitere beschreibende Namen für Ihren Knopf, dh self.quit_button; oder für Ihre Funktion, dh self.on_quit(), self.quit_app(), self.destroy() (beachten Sie, dass letzte müssten Super() aufzurufen. destroy() irgendwo in sonst werden Sie Dinge brechen)
+0

Vielen Dank! Das löst es. Sehr geschätzt. –