2012-04-14 60 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