2017-06-14 89 views
0

我想用tkinter來創建一個GUI,包含比例按鈕等。 現在,我有這個比例的集合。而且我知道可以使用scale.set() 來更新比例尺。現在,我有一個例如[[1,2,3,4,5],[5,4,3,2,1],[3,3,3,3,3]]的列表。TKinter比例和GUI更新

我想通過列表中的每個元素(如[1,2,3,4,5]),並更新與此元素的值的尺度(這也是一個列表)

所以我做

def runMotion(): 
    #r=3 
    for n in range(len(list)): 
     print(list[n]) 
     for count in range(5): 
      print(list[n][count]) 
      motorList[count].scale.set(list[n][count]) 
      #motorList[count].moveTo(list[n][count]) 
     time.sleep(5) 

這裏motorList是一個類數組,每個具有一定的規模,因此motorList[count].scale

的事情是,在GUI(鱗片)不被更新,除了最後一個(在本例[3,3,3,3,3] GUI執行時凍結ng,並且只有最後一個「動作」反映在比例值中。

我在python初學者,特別是做圖形用戶界面,我會是你使用的是「for」循環,其阻斷TK事件循環欣賞這裏的建議

回答

0

問題。這意味着事情是由您的程序計算的,但GUI不會更新。請嘗試以下操作:

list = [[1,2,3,4,5],[5,4,3,2,1],[3,3,3,3,3]] 

def runMotion(count): 
    if len(list) == count: 
     return 
    print(list[count]) 
    for index,n in enumerate(list[count]): 
     print(index,n) 
     motorList[index].set(n) 
     #motorList[count].moveTo(list[n][count]) 
    root.after(5000, lambda c=count+1: runMotion(c)) 

root = Tk() 
motorList = [] 
for i in range(1,6): 
    s = Scale(root, from_=1, to=5) 
    s.grid(row=i-1) 
    motorList.append(s) 
runMotion(0) 
root.mainloop() 
+0

謝謝。我會閱讀你的解決方案來理解它。只有一個問題:runMotion是否被遞歸調用? – KansaiRobot

+0

我問這是因爲在我編寫的程序中,在下一個版本中,我將無限期地運行它,並且我不想凍結GUI或耗盡資源 – KansaiRobot

+1

從技術上講,runMotion正在計劃在事件堆棧中。事件循環(mainloop)頻繁檢查事件堆棧,如果事件計劃運行,它將運行它。這就是root.after(5000 ...)命令正在做的事情 - 每次runMotion完成時放置一個事件。這具有在不阻止GUI內的用戶輸入的情況下執行GUI更新的效果,並且允許GUI在下一個runMotion事件之前可視地更新。 –