2016-04-29 28 views
0

私はtkinterで作ったguiを使って計算や方程式を解くプログラムを書こうとしていて、既知の値を入れています。値はtkinterのエントリウィジェットに入力されます(私はStringVar()ではなくIntVar()を使用していますので問題ありません)。何らかの理由で入力した値に関係なく、Python - IntVar/tkinterのエントリは0を返すだけです

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) 

コードのこのセクションは1になっている)の値が入力される標識されたフレームを作成し、2)の値を確認して作成する最初の知られている変数の整数値の入力ボックスとボタンを作成次の入力ボックス、3)ボタンが押されたときに次の入力ボックスを作成する、4)2番目の値を確認して次の入力ボックスを作成する、5)ボタンが押されたときに3番目の入力ボックスを作成する、ボタンを押してcalculate1d()関数を実行します。これは現在、プログラムが正しい値を返すかどうかを確認するためのプレースホルダです。

ただし、動作しません。最初の値の入力ボックスを作成し、2番目の入力ボックスとボタンを確認して作成するボタンを作成した後で、コードが停止します。このコードでは、入力ボックスに返される値が実際にどのように表示されるかはわかりません。しかし、をgetvalue2()の先頭に入れて、どの値を入力していても0を返していました。さらに、ボタンを押したときに値0が表示されました。最初の入力ボックスに数字を入力して最初のボタンを押した後で、getvalues_1dk()関数を呼び出していました。

ここから手伝ってください。私は約2日間このことに固執しています。私は考えることができるすべてを試しました。

編集:必要に応じて、ソースコード全体をペーストウェブサイトに投稿することができます。必要ならば尋ねるだけです。

+1

ソースコード全体を投稿する必要はありません。可能であれば、同じ問題を抱えた小規模の実用的なプログラム例... – VRage

+0

@VRage問題を再現するのに十分な問題が分かっていれば、私はそうするでしょう。しかし、私は試してみる。正直なところ、私はここに迷っています。私は最近、Tkinterの使用方法を学び始めたばかりです。なぜそれがうまくいかないのか、どうやって解決するのかについては完全に迷っています。私が言ったように、私は試みをします。 –

+0

うまくいけば、コード全体を投稿することができます。しかし、実際の例がなければ、デバッグは難しい – VRage

答えて

0

ttkエントリウィジェットは、tkエントリウィジェットよりもガベージコレクションの影響を受けやすくなっています。あなたはIntVarのローカル変数を使用しています。あなたはそれらがゴミ収集されていないことを確認する必要があります。さらに良いことに、それらをまったく使用しないでください。

ほとんどの場合、Entryウィジェットでは、StringVarおよび/またはIntVarの使用は完全に不要です。ウィジェットに値を入れたり、値をウィジェットの外に出すことができます。単に実際の利益を与えることなく維持する必要がある余分なオブジェクトを追加するだけです。それらが有用な唯一の時間は、同じ変数を複数のウィジェットに使用するか、変数にトレースを入れることです。

関連する問題