2016-12-25 5 views
0

Hier ist der Code:Python Typeerror: take_one() fehlt 1 Positions Argument erforderlich: 'Staat'

from tkinter import * 

class Main_content: 
    def take_one(self, state): 
     state = state - 1 
     return self.state 

    def take_two(self, state): 
     state = state - 2 
     return self.state 

    def __init__(self, master, state): 
     frame = Frame(master) 
     frame.pack() 

     self.label_status = Label(frame, text = "Coins left: " + str(state)) 
     self.label_status.pack() 
     self.label_status = Label(frame, text = "Player " + str(player) + " turn's") 
     self.label_status.pack() 

     self.pak_een = Button(frame, text="Take 1 coin", command=self.take_one) 
     self.pak_een.pack() 
     self.pak_twee = Button(frame, text="Take 2 coins", command=self.take_two) 
     self.pak_twee.pack() 

root = Tk() 

player = 1 
state = 21 
b = Main_content(root, state) 

root.mainloop() 

Der Fehler ist:

Traceback (most recent call last): 
    File "C:\Users\Freddie\AppData\Local\Programs\Python\Python35-32\lib\tkinter\__init__.py", line 1550, in __call__ 
    return self.func(*args) 
TypeError: take_two() missing 1 required positional argument: 'state' 

: Ich bin, so kann ich nicht herausfinden, Was ich falsch mache. Ich weiß nicht, was das bedeutet.

+0

Tasten nicht nd-Ereignisse oder andere Argumente an ihre Befehls-Handler. Woher soll dein Argument "Staat" kommen? – Marvo

+0

@DeepSpace Warum entfernen Sie Traceback-Tag und Python3-Tag? Es sind nicht nützlich? – Stargateur

+1

@Stargateur Dieser Fehler ist nicht Python3-spezifisch und das Rückverfolgungs-Tag ist für diese Frage nicht relevant. – DeepSpace

Antwort

2

Es gibt einige Probleme:

  1. take_one und take_two Methoden erwarten ein Argument state, aber Sie sie nie das Argument übergeben.

  2. self.state die Sie versuchen, in diesen Funktionen zurückzugeben, wird nirgends definiert.

  3. Auch wenn der Rest des Codes funktionierte, machen die Zeilen state = state - 1 und state = state - 2 nichts nützliches. state ist eine lokale Variable in diesen Funktionen und wird nie zurückgegeben oder verwendet.

Sie sollten state speichern, die __init__ in self.state verabschiedet wurde, dann werden die Event-Handler Zugriff darauf haben und nicht als Argument bekommen müssen und sie werden es nicht zurückkehren müssen:

class Main_content: 

    def take_one(self): 
     self.state -= 1 

    def take_two(self): 
     self.state -= 2 

    def __init__(self, master, state): 
     frame = Frame(master) 
     frame.pack() 

     self.state = state 
     self.label_status = Label(frame, text = "Coins left: " + str(self.state)) 
     self.label_status.pack() 
     self.label_status = Label(frame, text = "Player " + str(player) + " turn's") 
     self.label_status.pack() 

     self.pak_een = Button(frame, text="Take 1 coin", command=self.take_one) 
     self.pak_een.pack() 
     self.pak_twee = Button(frame, text="Take 2 coins", command=self.take_two) 
     self.pak_twee.pack() 

Wenn ich Ihre Logik bin folgende Sie müssen auch den Wert des Labels jedes Mal aktualisieren, eine Schaltfläche mit dem aktuellen Wert von self.state gedrückt wird, werde ich das als eine Übung für die Leser überlassen :)

+0

ja, jedes Mal, wenn ein Spieler einen Knopf drückte, muss das Etikett aktualisiert werden, aber wenn ich diesen Code ausführe, tut es nichts – Freddie

Verwandte Themen