2016-12-02 36 views
0

我正在嘗試創建一個GUI,它需要來自條目的各種數量的輸入。條目數應該在0到32之間靈活,用戶可以通過按鈕添加條目(簡化版本的程序)。 問題是,有32個條目GUI變得很長,我想添加一個滾動條,以最小化GUI窗口的大小,用戶可以滾動條目。Tkinter動態滾動條取決於條目數

我開發了一個基於我在這個網站上找到的代碼的例子,但我無法讓滾動條工作。 我的代碼簡化版本如下。 感謝您的幫助!

from tkinter import * 

class SlowCH_Manager(Canvas): 
    """ 
    Manages a variable number of slow channel massages 
    """ 
    def __init__(self,master=None,**kwargs): 
     Canvas.__init__(self,master,**kwargs) 
     self.frame = Frame(self) 
     self.create_window(0,0,anchor=N+W,window=self.frame) 
     self.row = 0 
     self.widgets = [] 
     self.max = 32 
     self._init_entries() 


    def _init_entries(self): 
     """ 
     initialize the input area with labels and perhaps default values 
     """ 
     label_id = Label(self.frame, text='message ID').grid(row = self.row, column = 1) 
     label_msg = Label(self.frame, text='message data').grid(row = self.row, column = 2) 
     self.row += 1 


    def add_entry(self): 
     """ 
     Dynamically add entry to GUI until max number of entries is arrived. 
     By SENT specification max 32 slow channel messages are allowed. 
     """ 
     if len(self.widgets) >= self.max: 
      print('Im full') 
     else: 
      label = Label(self.frame, text=str(len(self.widgets))).grid(row = self.row, column = 0) 
      entry_id = Entry(self.frame) 
      entry_id.grid(row = self.row, column = 1) 
      entry_data = Entry(self.frame) 
      entry_data.grid(row = self.row, column = 2) 
      self.row += 1 
      self.widgets.append(entry_id) 

    def _ypos(self): 
     return sum(x.winfo_reqheight() for x in self.widgets) 


if __name__ == "__main__": 
    root = Tk() 

    manager = SlowCH_Manager(root) 
    manager.grid(row=0,column=0) 

    scroll = Scrollbar(root) 
    scroll.grid(row=0,column=1,sticky=N+S) 

    manager.config(yscrollcommand = scroll.set) 
    scroll.config(command=manager.yview) 
    manager.configure(scrollregion = manager.bbox("all")) 

    b = Button(root, text = "add entry", command = manager.add_entry) 
    b.grid(row=1,column=0) 

    root.mainloop() 

回答

1

你每次都需要更新的畫布scrollregion你添加一個條目:

if __name__ == "__main__": 
    root = Tk() 

    manager = SlowCH_Manager(root) 
    manager.grid(row=0,column=0) 

    scroll = Scrollbar(root) 
    scroll.grid(row=0,column=1,sticky=N+S) 

    manager.config(yscrollcommand = scroll.set) 
    scroll.config(command=manager.yview) 
    manager.configure(scrollregion = manager.bbox("all")) 

    def command(): 
     manager.add_entry() 
     # update scrollregion 
     manager.configure(scrollregion = manager.bbox("all")) 

    b = Button(root, text = "add entry", command = command) 
    b.grid(row=1,column=0) 

    root.mainloop()