2017-08-27 1 views
-2
existieren

ich das tkinter Paket in Python wurde lernen, und es verstand nicht, nächsten Code:Python - Referenzvariablen, die nicht

import tkinter as tk 

class Application(tk.Frame): 
    def __init__(self, master=None): 
     super().__init__(master) 
     self.pack() 
     self.create_widgets() 

    def create_widgets(self): 
     self.hi_there = tk.Button(self) 
     self.hi_there["text"] = "Hello World\n(click me)" 
     self.hi_there["command"] = self.say_hi 
     self.hi_there.pack(side="top") 

     self.quit = tk.Button(self, text="QUIT", fg="red", command=root.destroy) 
     self.quit.pack(side="bottom") 

    def say_hi(self): 
     print("hi there, everyone!") 

root = tk.Tk() 
app = Application(master=root) 
app.mainloop() 

Wie ich self verstehen bezieht sich auf die Klasse und wenn der Code sagt self.hi_there Ich erwarte eine globale Variable in dieser Klasse, die vorher deklariert werden muss. Wie wird hi_there erstellt?

Auch was ist die Verwendung von "Master = None" in der __init__ Methode? Wäre es nicht das gleiche, wenn ich =None Teil überspringen würde, da ich app = Application(master=root) mache?

+0

Nicht sicher, warum Sie denken, dass sie nicht existieren. –

+0

Es ist bei 'self.hi_there = tk.Button (self)' erstellt. – Ryan

+0

Und es ist als globale Variable erstellt? Was ist die Bedeutung von Selbst hier? Warum nicht einfach "hi_there = tk.Button (self)" setzen? – akerbeltz

Antwort

1

self bezieht sich auf die Instanz. self.hi_there ist eine Instanzvariable. Indem Sie app = Application(master=root) tun, erstellen Sie eine Instanz von Application und speichern sie unter app. In Ihrem Fall ist selfapp.

Sie müssen Eigenschaften nicht deklarieren, bevor Sie sie erstellen (obwohl es als eine gute Vorgehensweise angesehen wird, sie in __init__ zu erstellen).

Betrachten Beispiel:

class A() 
    pass 

a = A() 
a.prop = 2 
print(a.prop) #=> 2 

Über master=None - in der Tat, können Sie einfach master verwenden, wenn es Ihr Code ist, und Sie wissen, dass Sie es passieren wird.

+0

aber in diesem Beispiel ändert es nichts, wenn ich einfach die Widgets wie 'hi_there = tk.Button (self)' anstelle von 'self.hi_there = tk.Button (self)' Was ist die Bedeutung von Selbst hier? – akerbeltz

+0

@akerbeltz Sorry, ich folge nicht. Was ist deine Frage? –

+0

Ich weiß nicht, wie ich es erklären soll, ich probierte den Code ohne das Selbst am Anfang bei jedem Widget und es ändert nichts (das merke ich). Warum nicht einfach "hi_there = tk.Button (self)" setzen? – akerbeltz

1

self bezieht sich auf die Instanz der Klasse und dafür self.hi_there = foo wird eine neue Instanz Variable, und weisen sie zu foo wie erstellen:

class Test: 
    def __init__(self): 
     self.foo = 'bar' 

a = Test() 
print(a.foo) 

# output: 
# bar 

Und master=None setzt einen Standard None Wert master es sei denn, Sie liefern diesen Wert, zum Beispiel:

app = Application() # here master will be None 
app = Application(master=root) # here master will be root 

diese kann mit jeder Funktion verwendet werden, hier ist ein anderes Beispiel:

def plus(num=0): 
    return num+num 

print(plus(1)) 
print(plus()) 

# output: 
# 2 
# 0 
Verwandte Themen