2012-06-03 22 views
5

我是新來的這個地方和tkinter。我被困在製作可滾動的列表框或畫布。我已經嘗試了兩個小部件。在這個列表框或畫布中,我有幾個入口和標籤小部件。原點是R0,C0。我使用row/columnconfigure來擴展列表框或畫布。使用tkinter的網格內的可滾動列表框

在主窗口中,我在第4行到第4行(0,4> 4,4)上有4個按鈕。我將滾動條放在第5列。我試圖使用網格方法。我遇到的問題是使滾動條起作用。

注意:將主機變成一個類只是我嘗試過的一種方法。包裝右側的滾動條已經工作了,左側列表框/畫布包裝在左側。但是,滾動條命令的listbox/canvas小部件不會滾動列表框/畫布。此外,添加許多輸入框不會導致列表框/畫布滾動。請幫助。

from tkinter import * 
from tkinter.ttk import * 

Style().configure("B.TFrame", relief="flat", 
background="blue") 
Style().configure("R.TFrame", relief="flat", 
background="red") 
Style().configure("R.TLabel", background="red") 

class Application(Frame): 
    def __init__(self, master=None): 
     Frame.__init__(self, master, style="B.TFrame") 
     self.grid(sticky=N+S+E+W) 
     self.mainframe() 

    def mainframe(self): 
     top=self.winfo_toplevel() 
     self.menuBar = Menu(top) 
     top["menu"] = self.menuBar 
     self.subMenu = Menu(self.menuBar, tearoff=0) 
     self.subMenu2 = Menu(self.menuBar, tearoff=0) 
     self.menuBar.add_cascade(label="File", menu=self.subMenu) 
     self.menuBar.add_cascade(label="About", menu=self.subMenu2) 
     self.subMenu.add_command(label="Open") 
     self.subMenu.add_command(label="Save") 
     self.subMenu.add_command(label="Exit") 
     self.subMenu2.add_command(label="About") 
     self.subMenu2.add_command(label="Help") 



     self.data = Listbox (self, bg='red') 
     scrollbar = Scrollbar(self.data, orient=VERTICAL) 

     self.add = Button(self, text="") 
     self.remove = Button(self, text="") 
     self.run = Button(self, text="") 
     self.stop = Button(self, text="") 

     self.data.grid (row=0, column=0, rowspan=4, columnspan=4, sticky=N+E+S+W) 
     self.data.columnconfigure(1, weight=1) 
     self.data.columnconfigure(3, weight=1) 

     self.add.grid(row=4,column=0,sticky=EW)  
     self.remove.grid(row=4,column=1,sticky=EW) 
     self.run.grid(row=4,column=2,sticky=EW) 
     self.stop.grid(row=4,column=3,sticky=EW) 
     scrollbar.grid(column=5, sticky=N+S) 
+0

請避免使用通配符進口,特別是如果你發佈您的代碼在SO ... – fodma1

回答

7

沒有在列表框中的任何內容,沒有什麼滾動......

這似乎工作,雖然(縮短了例如位)。請參閱scrollbar documentation上的示例。

class Application(Frame): 
    def __init__(self, master=None): 
     Frame.__init__(self, master)  
     self.grid(sticky=N+S+E+W) 
     self.mainframe() 

    def mainframe(self):     
     self.data = Listbox(self, bg='red') 
     self.scrollbar = Scrollbar(self.data, orient=VERTICAL) 
     self.data.config(yscrollcommand=self.scrollbar.set) 
     self.scrollbar.config(command=self.data.yview) 

     for i in range(1000): 
      self.data.insert(END, str(i)) 

    self.run = Button(self, text="run") 
    self.stop = Button(self, text="stop") 

    self.data.grid(row=0, column=0, rowspan=4, 
        columnspan=2, sticky=N+E+S+W) 
    self.data.columnconfigure(0, weight=1) 

    self.run.grid(row=4,column=0,sticky=EW) 
    self.stop.grid(row=4,column=1,sticky=EW) 

    self.scrollbar.grid(column=2, sticky=N+S) 

a = Application() 
a.mainframe() 
a.mainloop() 
+0

對不起,我是新來的(剛學會看的響應..一年後)。我很感激答覆。我看着我的問題,現在我很尷尬。我遇到的問題是添加輸入框。我已經移動了,但是當我添加了12個以上的輸入框並預覽了結果後,屏幕上的列表框項目看起來就可以滾動了。謝謝。 – Lect

2

您必須定義command屬性的滾動條,你必須提供yscrollcommand屬性列表框。這兩個屬性一起工作來製作可滾動的內容。

yscrollcommand選項告訴列表框「當你在Y方向滾動,調用這個命令。這通常是一個滾動的set方法,這樣,當通過方向鍵用戶滾動,滾動條被更新。

scorllbar的command屬性表示「當用戶移動你時,調用此命令」。這通常是小部件的yviewxview方法,這會導致小部件在Y或X方向上更改其視圖參數。

在你的情況下,創建小部件後,你可以這樣做:

self.data.config(yscrollcommand=self.scrollbar.set) 
scrollbar.config(command=self.data.yview)