在Tkinter中将行设置为变量

时间:2012-04-14 08:39:16

标签: python grid tkinter

我无法更新Tkinter中的行。

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

有两点需要注意: 如果你在脚本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()

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分:0)

您可以使用常规python变量或Tkinter变量。以下是两个工作示例。

Tkinter变量类是可以“跟踪”变化的变量(即可能会通知您值已更改)。它们与具有值(小部件,条目...)的小部件一起使用,例如检索值或同步两个小部件。

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)