2016-05-13 2 views
0

Ich lerne Python & Tkinter und ein Tutorial folgen. Ich mache ein Programm, um das zu tun, was ich in Skriptsprachen wie Powershell mache, bekomme einen Benutzerwert und mache dann etwas damit.Python & TkInter - Wie bekomme ich Wert von Benutzer im Eingabefeld, dann drucken Sie es auf dem Terminal

Ich kann keinen Beispielcode finden, der wie meins aussieht. Also bitte ich um deine Hilfe.

Grundsätzlich erstellt dieses Programm einen Rahmen mit einem Quit Button, einem Eingabe-Widget, bei dem der Benutzer einen Wert eingibt, & eine OK-Schaltfläche. Dann drückt er die OK-Taste, und der Wert sollte im Python-Terminal gedruckt werden.

Ich bekomme einen Fehler, aber ich verstehe nicht warum. Ich folge einem Tutorial, also mache ich es so, wie sie es zeigen, indem ich eine Klasse definiere, um den Frame zu erstellen, indem ich die Schaltflächen & Textfeld darin platziere.

Die Funktion, um den Benutzereingabetext aus dem Eintrag Widget zu erhalten, ist unten, wo ich meine anderen Funktionen setzen würde, wenn ich sagen würde, ich möchte Funktionen für Schaltflächen hinzufügen, um einen Druck zu machen. Ich habe es geschafft, den Druck zu machen, wenn der zu druckende Wert vorher eingestellt wurde, aber ich kann den Wert nicht vom Eintritts-Widget erhalten.

from tkinter import * 

class Window: 
def __init__(self, master): 
    self.master = master 
    master.title("Get a value and print it") 
    self.info = Label(master, text="Please write something then click ENTER") 
    self.info.pack() 

    self.ebox= Entry() 
    self.ebox.pack() 

    self.viewnumber = Button(master, text="OK", activebackground="red", command=get_int) 
    self.viewnumber.pack() 

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

def get_int(): 
    intnum = ebox.get 
    print(intnum) 

def quit(): 
    root.quit() 

root = Tk() 
root.geometry("400x400") 
my_gui = Window(root) 
root.mainloop() 

Ich erhalte diese Fehlermeldung:

Exception in Tkinter callback 
Traceback (most recent call last): 
    File "C:\Users\USERNAME\AppData\Local\Programs\Python\Python35-32\lib\tkint 
er\__init__.py", line 1549, in __call__ 
    return self.func(*args) 
    File "C:\Users\USERNAME\Desktop\pyth222184.py", line 20, in get_int 
    intnum = ebox.get 
NameError: name 'ebox' is not defined 

Dank für Ihre Hilfe danken.

+1

Also, es sagt Ihnen, dass 'ebox' nicht existiert. Wenn ich deinen Code durchschaue, muss ich zustimmen: Es gibt keine "E-Box". Es gibt eine 'self.ebox', aber 'self.ebox' ist nicht dasselbe wie' ebox'. Eine gute Faustregel beim Debuggen ist die Annahme, dass der Fehler die wörtliche Wahrheit sagt. –

+0

Hat meine Antwort geholfen? –

Antwort

3

Eigentlich ist das Problem, dass Ebox nicht von der Funktion zugegriffen werden kann. Sie müssen self.ebox verwenden, damit es tatsächlich auf die Instanzvariable ebox verweist. Um mehr darüber zu erfahren, besuchen Sie here.

Sie verwenden auch self.ebox.get anstelle von self.ebox.get(). self.ebox.get allein würde das Raw-Funktionsobjekt von self.entry.get zurückgeben. Um die Funktion tatsächlich aufzurufen und den Inhalt abzurufen, verwenden Sie self.ebox.get().

Aber damit das funktioniert, muss self definiert werden. Fügen Sie dazu als erstes Argument in jeder Methode self hinzu. Wenn Sie instance.method() aufrufen, wird Python automatisch instance als self übergeben. Im Wesentlichen können Sie mit self auf die aktuelle Instanz zugreifen.

+0

Vielen Dank für Ihre Hilfe und Ihre Antwort. Wie Sie vorgeschlagen haben, habe ich diese Änderung vorgenommen: 'def get_int(): \t intnum = self.ebox.get() \t print (IntNum) ' Und dann bekomme ich diesen Fehler: ' Nameerror: name ‚Selbst‘ nicht defined' ist ich ziemlich sicher, dass selbst bin ist oben ... definiert Wie wird selbst nicht definiert? – Smor

+0

@Smor Sie müssen sich selbst als Argument "get_int", wie Sie für "__init__" getan haben. Wenn Sie 'object.method()' aufrufen, gibt es tatsächlich ein Argument für 'method' namens' self', das Python automatisch in 'object' als Wert für. –

+0

@XamuelSchulman get_int ist keine Methode, sonst hätte die Initialisierung für die Schaltfläche 'command = self.get_int' und der Fehler wäre' TypeError: get_int() nimmt 0 Positionsargumente, aber 1 wurde angegeben', also muss das OP dies tun benutze 'my_gui' anstelle von' self' oder mache 'get_int' eine Methode, die sowieso mehr Sinn macht. –

0

Das stimmt. Das get_int in Class ist eine Methode, und Sie können das nicht wie eine Funktion aufrufen. Sie müssten das wie eine Methode so etwas nennen

elf.viewnumber = Button(master, text="OK",bg="red",command=lambda:my_gui.get_int()) 
self.viewnumber.pack() 

Dies ist ein Beispiel für Code, der funktionieren würde.