2012-04-14 103 views
0

我无法更新Tkinter中的行。将行设置为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() 
+1

您能否提供更完整的代码示例? 'row = self.activeRow'应该可以工作,前提是'self'具有为'activeRow'设置的值。 – cfedermann 2012-04-14 08:52:26

+0

好的,我只是用更多的细节重写了它。 如果我的格式化/样式已关闭,请让我知道,因为我在6周前才开始学习如何编程。 – Talisin 2012-04-14 10:30:13

+0

哦,只是为了节省您重新阅读它的问题是: 如果self.activeRow是一个正常的变量,它不会更新,如果它是一个IntVar,那么它不会被接受,因为它不是一个int。那么我怎么才能让它改变行呢? – Talisin 2012-04-14 10:39:12

回答

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() 
+0

你是男人之神!非常感谢,我终于可以回到我的任务! – Talisin 2012-04-15 23:41:24

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) 
+0

好吧,只是更新了我原来的帖子,并写了2个脚本来更好地解释问题。你的2个修改是运行的,但它们实际上并不涉及任何更新,因为这个修改来自于for循环,并且从一开始就有。正确的更新是我想要ou – Talisin 2012-04-15 03:36:18

+0

确定,最终发现你的问题,我发表了另一个答案。 – FabienAndre 2012-04-15 13:07:38