2017-08-19 3 views
0

und danke fürs Zuhören ... und Entschuldigung für mein schlechtes Englisch. Ich habe ein Problem mit einem einfachen Python-Skript und ich weiß nicht, wie ich meinen Kopf zertrümmern soll.Python noob mit Argumenten, Klassen und Tkinter

Das ist der Code. Ist ziemlich einfach und nutzlos (ich lerne Python, aber meine Programmierkenntnisse sind peinlich).

import tkinter as tk 

class hello: 
    button_state = [0,0,0,0,0,0,0,0,0] 
    def __init__(self): 
     self.root = tk.Tk() 
     self.button = tk.Button(self.root, text=self.button_state[0], 
              command=self.check(0)) 
     self.button.pack() 
    def check(self,x): 
     if x == 0: 
      self.button_state[x] = 1 
      self.button.config(text=self.button_state[x]) 

app = hello() 
app.root.mainloop() 

und der Fehler:

AttributeError: 'hello' object has no attribute 'button' 

ich weiß nicht, warum existieren ‚Wenn ich ein Label das Problem nicht verwenden. Ich versuche und versuche und ich denke, der Fehler war in der Argumentaufruf in Button-Befehl?

Vielen Dank im Voraus :)

Antwort

0

verwenden Sie command = self.check (0) in init. In check() verwendest du self.button.config. Aber es gibt kein Attribut (self.button) im Objekt. Vielleicht hilft dir dieser Code. Auch in hallo Sie eine Klasse Attribut button_state verwenden - Sie müssen das verstehen: siehe https://docs.python.org/2/tutorial/classes.html (# verwechselt Verwendung einer Klassenvariablen)

import Tkinter as tk 

class hello: 
    button_state = [0,0,0,0,0,0,0,0,0] 
    def __init__(self): 
     self.root = tk.Tk()   
     self.button = tk.Button(self.root, text=self.button_state[0], command=self.check(0)) 
     self.button.config(text=self.button_state[0]) 
     self.button.pack() 

    def check(self,x): 
     if x == 0: 
      self.button_state[x] = 1 

app = hello() 
app.root.mainloop() 
0

Wenn Ihr Programm zum ersten Mal läuft es läuft die Funktion von self.button ist vorgesehen Befehl. Da Sie Ihre self.button immer noch nicht gepackt haben, wird durch einen Aufruf in dieser Funktion ein Fehler ausgegeben. Um diesen ersten automatischen Funktionsaufruf zu verhindern, können Sie lambda verwenden. Dadurch wird sichergestellt, dass die Funktion nur dann aufruft, wenn Sie diese self.button verwenden.

einfach diesen Teil des Codes ändern:

command=self.check(0) 

Um dies:

command= lambda x=0: self.check(x)