2012-04-14 10 views
0

Tkinterの行を更新できません。Tkinterの行を変数に設定する

行を通常の変数に設定すると、更新されません。これは最初のスクリプトに示されています。 テキストと同様に行をIntVar型に設定すると、データ型が拒否されます。これは2番目のスクリプトに示されています。

2注意事項: スクリプト1でカウンタを見ると、上がってもうまくいきますが、適用されません。 あなたの代わりにself.activeRowのself.activeRow.get()を使用している場合は、それが効果的にスクリプトで1

を示したものと同じ結果を通常の変数にそれを向けるだろうスクリプト1

from tkinter import * 

class Example(Frame): 

    def move(self): 
     self.activeRow += 1 
     print(self.activeRow) 

    def __init__(self, parent): 
     Frame.__init__(self, parent) 
     self.parent = parent 
     self.initUI() 

    def initUI(self): 

     self.columnconfigure(0, pad=0)  
     self.columnconfigure(1, pad=0) 
     self.columnconfigure(2, pad=0) 
     self.rowconfigure(0, pad=0) 
     self.rowconfigure(1, pad=0) 
     self.rowconfigure(2, pad=0) 

     Label(self, text= 'row 0').grid(row=0, column=0) 
     Label(self, text= 'row 1').grid(row=1, column=0) 
     Label(self, text= 'row 2').grid(row=2, column=0) 

     #regular variable 
     self.activeRow = 0 
     b = Button(self, text="normal variable {0}".format(self.activeRow), command=self.move) 
     b.grid(row=self.activeRow, column=1) 


     self.pack() 




def main(): 
    root = Tk() 
    app = Example(root) 
    root.mainloop() 


if __name__ == '__main__': 
    main() 

スクリプト2

from tkinter import * 

class Example(Frame): 

    def move(self): 
     self.activeRow.set(self.activeRow.get() + 1) 
     print(self.activeRow.get()) 

    def __init__(self, parent): 
     Frame.__init__(self, parent) 
     self.parent = parent 
     self.initUI() 

    def initUI(self): 

     self.columnconfigure(0, pad=0)  
     self.columnconfigure(1, pad=0) 
     self.columnconfigure(2, pad=0) 
     self.rowconfigure(0, pad=0) 
     self.rowconfigure(1, pad=0) 
     self.rowconfigure(2, pad=0) 

     Label(self, text= 'row 0').grid(row=0, column=0) 
     Label(self, text= 'row 1').grid(row=1, column=0) 
     Label(self, text= 'row 2').grid(row=2, column=0) 

     #Tkinter IntVar 
     self.activeRow = IntVar() 
     self.activeRow.set(0) 


     b = Button(self, text="IntVar", command=self.move) 
     b.grid(row=self.activeRow, column=1) 


     self.pack() 
+1

より完全なコード例を提供できますか? 'row = self.activeRow'は' self'が 'activeRow'に設定された値を持っていれば動作します。 – cfedermann

+0

さて、私はちょうど詳細でそれを書き直しました。 私の書式設定/スタイルがオフの場合、plsは私が6週間前にプログラムする方法を学び始めたので私に知らせてくれます。 – Talisin

+0

ああ、ちょうどあなたがそれを再読み込みするのを救うために、問題は: もしself.activeRowが普通の変数であれば、それは更新されませんし、IntVarならintではないので受け入れられません。だから私はそれが行を変更することができますか? – Talisin

答えて

1

既存のウィジェットを移動したい場合は、このウィジェット(すなわちwidget.grid(row=other_value))を更新するために、再度gridメソッドを呼び出す必要があります。ウィジェットを削除するには、grid_forget()メソッドを使用できます。

from Tkinter import * 

class Example(Frame): 
    def __init__(self, parent): 
     Frame.__init__(self, parent) 
     self.initUI() 

    def move(self): 
     info = self.b.grid_info() 
     previous_row = int(info["row"]) #int() needed because datas are stored as string 
     self.b.grid(row=previous_row+1) 

    def initUI(self): 
     for i in range(5): 
      l = Label(self, text="Row {0}".format(i)) 
      l.grid(row=i, column=0) 

     self.b = Button(self, text="Moving button", command=self.move) 
     self.b.grid(row=0, column=1) 

     self.pack() 

root = Tk() 
app = Example(root) 
root.mainloop() 
+0

あなたは男の中の神です!おかげさまで、ついに私の任務に戻ることができます! – Talisin

0

通常のPython変数またはTkinter変数を使用できます。以下に2つの作業例を示します。

Tkinter変数クラスは、変更が "追跡"できる変数です(つまり、値が変更されたことを通知されることがあります)。それらは値を持つウィジェット(例えば、Scale、Entry ...)で使用され、値を検索したり、2つのウィジェットを同期したりします。

def initUI(self): 
    #regular variable 
    self.activeRow = 0 
    for i in range(5): 
     b = Button(self, text="normal variable {0}".format(self.activeRow)) 
     b.grid(row=self.activeRow, column=0) 
     self.activeRow += 1 

    #Tkinter IntVar 
    self.activeRow = IntVar() 
    for i in range (5): 
     b = Button(self, text="IntVar {0}".format(self.activeRow.get())) 
     b.grid(row=self.activeRow.get(), column=1) 
     self.activeRow.set(self.activeRow.get() + 1) 
+0

[OK]を、ちょうど私の元の記事を更新し、問題をよりよく説明する2つのスクリプトを書いた。あなたの2つの修正は実行されますが、変更はforループから来て、最初からそこにあるので、実際には更新を伴いません。正しい更新は私がOOを理解しようとしているものです – Talisin

+0

OK、最終的にあなたの質問をキャッチ、私は別の答えを投稿します。 – FabienAndre

関連する問題