2012-03-05 663 views
5

我想輸出數據庫的內容到Tkinter小部件。該數據庫有足夠的行和列,我需要啓用水平和垂直滾動條,但我很難讓水平和垂直滾動同時工作。我並不想知道這Tkinter的部件使用,但這裏是我當前的實現:Tkinter小部件上的垂直和水平滾動條

# Create root 
self.root = Tk() 
self.root.geometry('1000x500+0+0') 

# Create canvas 
self.canvas = Canvas(self.root) 
self.canvas.pack(side=TOP, fill=BOTH, expand=TRUE) 

# Create scrollbars 
self.xscrollbar = Scrollbar(self.root, orient=HORIZONTAL, command=self.canvas.xview) 
self.xscrollbar.pack(side=BOTTOM, fill=X) 
self.yscrollbar = Scrollbar(self.root, orient=VERTICAL, command=self.canvas.yview) 
self.yscrollbar.pack(side=RIGHT, fill=Y) 

# Attach canvas to scrollbars 
self.canvas.configure(xscrollcommand=self.xscrollbar.set) 
self.canvas.configure(yscrollcommand=self.yscrollbar.set) 

# Create frame inside canvas 
self.frame = Frame(self.canvas) 
self.canvas.create_window((0,0), window=self.frame, anchor=NW) 
self.frame.bind('<Configure>', self.set_scrollregion) 

# Write db contents to canvas 
self.print_dbcontents() 

# Invoke main loop 
self.root.mainloop() 

def set_scrollregion(self, event): 
    self.canvas.configure(scrollregion=self.canvas.bbox('all')) 

在此實現,我只能得到滾動在一個方向去努力,這取決於我如何收拾帆布:

self.canvas.pack(side=TOP, fill=BOTH, expand=TRUE) # scrolling works in x but not y 
self.canvas.pack(side=LEFT, fill=BOTH, expand=TRUE) # scrolling works in y but not x 

我只需要水平和垂直滾動同時工作,或找到一個替代解決方案。

+0

本教程中的[滾動示例](http://www.tkdocs.com/tutorial/canvas.html#scrolling)按預期工作(導入應該修改爲Python 2.x)。 – jfs 2012-03-05 05:44:54

回答

8

我沒有看到任何會阻止滾動條工作的代碼。我看到一個問題,阻止滾動條出現在你期望的位置(假設你期望它們出現在傳統的地方)。這是你說你希望他們「同時工作」的意思嗎?

您的佈局與下面的代碼,並按照以下順序進行:

self.canvas.pack(side=TOP, fill=BOTH, expand=TRUE) 
self.xscrollbar.pack(side=BOTTOM, fill=X) 
self.yscrollbar.pack(side=RIGHT, fill=Y) 

也就是說第一行會導致畫布,以填補小部件的整個頂部,從左側一路一路在右邊。當您稍後將右側滾動條放置在右側時,這意味着在畫布填滿頂部之後,它將位於左側的空間的右側。由於畫布填滿了頂部,因此在右側沒有剩餘空間,僅在下方。因此,您的滾動條將顯示爲一個關於畫布下方水平滾動條高度的小部件。

快速修復是首先打包垂直滾動條,然後水平,然後畫布。您的「主要」小部件應始終是您打包/網格的最後一件事情之一。其一,你這麼做的原因很明顯,在這種情況下你需要達到預期的效果,但也是因爲它使你的調整行爲正確。我正在下主題解釋爲什麼在這個答案中,所以請閱讀this answer on stackoverflow瞭解更多信息。

其次,在使用滾動條時,如果需要專業外觀,最好使用網格。如果使用包裝,滾動條將不會對齊其所在角落的財產。你想他們這個樣子,一個小空格在右下角:

|| 
== 

但是,如果使用包,他們會像這些之一:

|| -or-  || 
====   ==|| 

最後,我鼓勵你不是import *,它可能會導致問題的道路。相反,養成做import Tkinter as tk的習慣,然後在所有的tk命令前添加「tk」。 (例如:tk.Canvas等)。你會明白爲什麼這是第一次嘗試在同一個用戶界面中混合使用ttk和tkinter小部件,但如果你還從其他軟件包中「導入*」,你可能會在別處遇到問題。另外,這種方式很明顯,當你使用tk功能時,以及你使用其他軟件包的功能。