2016-04-29 9 views
0

Ich versuche, ein Programm zu schreiben, um Berechnungen zu machen und Gleichungen zu lösen, mit einer GUI, die mit tkinter gemacht wurde, und bin zu dem Punkt gekommen, bekannte Werte einzutragen. Die Werte werden in tkinter's Eingabe-Widget eingegeben (ich verwende IntVar(), nicht StringVar(), also ist das nicht das Problem), aber aus irgendeinem Grund, egal welchen Wert ich eingabe, es wird nur als 0 zurückgeben.Python - IntVar/Eintrag in tkinter gibt nur 0 zurück

def getvalues_1dk(): 
    getvalues2frame = ttk.Frame(calculations_root, width=100, height=100, padding="5") 
    getvalues2frame['borderwidth'] = 3 
    getvalues2frame['relief'] = 'raised' 
    getvalues2label = ttk.Label(getvalues2frame, text="Step 5: Enter a value for each of the variables you\n" 
                 " selected in step 4.") 
    getvalues2label.grid(row=1, column=1, sticky=(N, W)) 
    getvalues2frame.grid(row=0, column=0, sticky=E) 
    getvalue1(getvalues2frame) 
    return getvalues2frame 

def getvalue1(getvalues2frame): 
    if known1d1.get() and known1d2.get() and known1d3.get(): 
     known1d1entryvar = IntVar() 
     known1d1entry = ttk.Entry(getvalues2frame, textvariable=known1d1entryvar) 
     ttk.Label(getvalues2frame, text=known1d1.get()).grid(row=2, column=1, sticky=W) 
     known1d1entry.grid(row=2, column=1, sticky=E) 
     ttk.Button(getvalues2frame, text="Confirm", 
        command=(getvalue2(getvalues2frame, known1d1entryvar))).grid(row=3, column=1, 
                       sticky=E) 
     return known1d1entryvar 

def getvalue2(getvalues2frame, known1d1entryvar): 
    if known1d1entryvar.get(): 
     known1d2entryvar = IntVar() 
     known1d2entry = ttk.Entry(getvalues2frame, textvariable=known1d2entryvar) 
     ttk.Label(getvalues2frame, text=known1d2.get()).grid(row=4, column=1, sticky=W) 
     known1d2entry.grid(row=4, column=1, sticky=E) 
     ttk.Button(getvalues2frame, text="Confirm", 
        command=(getvalue3(getvalues2frame, known1d1entryvar, known1d2entryvar))).grid(row=5, column=1, 
                            sticky=E) 
     return known1d2entryvar 

def getvalue3(getvalues2frame, known1d1entryvar, known1d2entryvar): 
    if known1d2entryvar.get(): 
     known1d3entryvar = IntVar() 
     known1d3entry = ttk.Entry(getvalues2frame, textvariable=known1d3entryvar) 
     ttk.Label(getvalues2frame, text=known1d3.get()).grid(row=6, column=1, sticky=W) 
     known1d3entry.grid(row=6, column=1, sticky=E) 
     calculatebutton = ttk.Button(getvalues2frame, text="Show formula and calculate", 
            command=(
             calculate1d(known1d1entryvar, known1d2entryvar, known1d3entryvar, 
                solveforvar1d, unusedvar1d))) 
     calculatebutton.grid(row=7, column=1, sticky=E) 

def calculate1d(known1d1entryvar, known1d2entryvar, known1d3entryvar, solveforvar1d, unusedvar1d): 
    if known1d1entryvar.get() and known1d2entryvar.get() and known1d3entryvar.get(): 
     knownvar1 = known1d1entryvar.get() 
     knownvar2 = known1d2entryvar.get() 
     knownvar3 = known1d3entryvar.get() 
     print(knownvar1, knownvar2, knownvar3) 
     solveforvar1d = Symbol(solveforvar1d) 
     print(solveforvar1d) 
     print(unusedvar1d) 

Dieser Abschnitt des Codes wird ein bezeichnetes Bild zu 1) schaffen, in dem Wert eingegeben soll, 2) schaffen ein Eingabefeld für einen ganzzahligen Wert der ersten bekannten variablen und einen um den Wert zu bestätigen und erstellen das nächste Eingabefeld, 3) das nächste Eingabefeld erstellen, wenn die Schaltfläche gedrückt wird, 4) eine weitere Schaltfläche erstellen, um den 2. Wert zu bestätigen und das nächste Eingabefeld zu erstellen, 5) ein drittes Eingabefeld erstellen und eine neue erstellen Klicken Sie auf diese Schaltfläche, um die Funktion calculate1d() auszuführen, die derzeit ein Platzhalter ist, um festzustellen, ob das Programm die richtigen Werte zurückgibt.

Es funktioniert jedoch nicht. Der Code, wie er jetzt ist, bleibt nach dem Erstellen des Eingabefeldes für den ersten Wert stehen und erzeugt die Schaltfläche zum Bestätigen und erstellt das 2. Eingabefeld und die Schaltfläche. Mit diesem Code gibt es keinen Punkt, an dem ich tatsächlich sehe, welcher Wert für die Eingabefelder zurückgegeben wird. Jedoch habe ich versucht Putting setzen print(known1d1entryvar.get()) am Anfang von getvalue2(), um zu sehen, welchen Wert es zurückgegeben wurde, und egal, welchen Wert ich eingegeben habe, gab es 0 zurück. Darüber hinaus gab es den Wert 0, wenn ich den Knopf (nicht gezeigt) gedrückt das ruft die getvalues_1dk() Funktion auf, nicht wenn ich es wollte, nach Eingabe einer Nummer in das erste Eingabefeld und Drücken der ersten Taste.

Bitte helfen Sie mir hier. Ich bin jetzt seit ungefähr zwei Tagen dabei und habe alles versucht, was mir einfällt.

EDIT: Wenn nötig, kann ich meinen gesamten Quellcode auf einer Paste-Website veröffentlichen. Frag einfach wenn nötig.

+1

Sie müssen nicht den gesamten Quellcode posten. Nur ein kleines Beispielprogramm mit dem gleichen Problem ... wenn es möglich ist – VRage

+0

@VRage Wenn ich wüsste, was das Problem gut genug ist, um es neu zu erstellen, würde ich. Aber ich werde es versuchen. Ehrlich gesagt, bin ich hier ratlos. Ich habe erst vor kurzem gelernt, wie man Tkinter benutzt und ich weiß nicht, warum es nicht funktioniert und wie ich es beheben kann. Wie gesagt, ich werde einen Versuch machen. –

+0

Nun, Sie können den gesamten Code veröffentlichen, wenn Sie möchten. Aber ohne ein funktionierendes Beispiel ist es schwer zu debuggen – VRage

Antwort

0

ttk entry Widgets sind anfälliger für die Garbage Collection als die tk entry Wigets. Sie verwenden lokale Variablen für Ihre IntVar s. Sie müssen sicherstellen, dass diese keinen Müll sammeln. Noch besser, benutze sie überhaupt nicht.

Die meiste Zeit ist die Verwendung von StringVar und/oder IntVar völlig unnötig mit Entry Widgets. Sie können Werte eingeben und Werte ohne diese Elemente aus den Widgets abrufen. Sie fügen lediglich ein zusätzliches Objekt hinzu, das beibehalten werden muss, ohne einen wirklichen Nutzen zu bringen. Sie sind nur dann nützlich, wenn Sie dieselbe Variable für mehr als ein Widget verwenden oder Spuren für die Variablen einfügen.

Verwandte Themen