0

我无法更新 Tkinter 中的行。

如果我将行设置为常规变量,它不会更新。这显示在第一个脚本中。如果我像处理文本一样将行设置为 IntVar 类型,它会拒绝数据类型。这显示在第二个脚本中。

需要注意的 2 件事:如果您观察脚本 1 中的计数器,它会正常上升,但不会被应用。如果您使用 self.activeRow.get() 而不是 self.activeRow,它将有效地将其转换为正常变量,其结果与脚本 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 变量。下面是两个工作示例。

Tkinter 变量类是可以“跟踪”更改的变量(即,您可能会收到值已更改的通知)。它们与具有值(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 回答