0

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()
4

2 に答える 2

1

既存のウィジェットを移動したい場合は、gridメソッドを再度呼び出してこのウィジェットを更新する必要があります (つまりwidget.grid(row=other_value))。ウィジェットを削除するには、 メソッドを使用できます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()
于 2012-04-15T13:06:08.350 に答える
0

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

Tkinter 変数クラスは、変更を「追跡」できる変数です (つまり、値が変更されたことが通知される場合があります)。これらは、値を取得するため、または 2 つのウィジェットを同期するために、値 (Scale、Entry...) を持つウィジェットで使用されます。

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)
于 2012-04-14T12:36:11.327 に答える