2012-03-05 49 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')) 

この実装では、私は、私はキャンバスをパックする方法に応じて、1つの方向に動作するようにスクロールを取得することができます。

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

答えて

8

スクロールバーが動作しないようなコードはありません。私はスクロールバーの1つがあなたがそれを期待しているところに現れないようにする問題を見ています。それはあなたがホエイを意味するものなのですか?あなたは彼らに「同時に働きたい」と言いますか?

あなたのレイアウトは次のコードで、次の順序で行われます。最初の行はすべての方法に一番左から、ウィジェットの全体のトップを埋めるためにキャンバスを引き起こすこと

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

右の方へ。後でyscrollbarを右に置くと、これはキャンバスが上にいっぱいになった後に、の左にあるスペースの右に移動することを意味します。キャンバスが上を埋めるので、右にスペースが残っていません。下にのみあります。したがって、スクロールバーは、キャンバスの下の水平スクロールバーの高さに関する小さなウィジェットとして表示されます。

早急に垂直スクロールバーをパックし、水平にしてから、キャンバスをにパックします。あなたの "メジャーな"ウィジェットは、常にあなたがパックする/グリッドの最後のものの1つであるべきです。 1つは、あなたが望む効果を得るためにこの場合に必要な明白な理由のために、あなたのサイズ変更の動作を正しくするためです。なぜ私はこの答えで説明するために話題になっているので、詳細についてはthis answer on stackoverflowをお読みください。

第2に、スクロールバーを使って作業するときは、プロフェッショナルな外観が必要な場合は、グリッドを使用することをお勧めします。パックを使用すると、スクロールバーはプロパティが一致する隅にプロパティを揃えません。最後に

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

:あなたはパックを使用する場合、彼らはこれらのいずれかのように見えます、しかし

|| 
== 

:あなたは彼らが右下隅に小さな空白で、次のようになりたいです私はではなく、import *であることをお勧めします。代わりに、import Tkinter as tkを実行し、すべてのtkコマンドの前に "tk"という接頭辞を付けてください。 (例:tk.Canvasなど)。同じUIでttkウィジェットとtkinterウィジェットを初めて組み合わせようとすると、なぜこのことが重要になるのか分かりますが、他のパッケージからも同様に "import *"すれば他の場所で問題が発生する可能性があります。さらに、tk機能を使用しているときや、他のパッケージの機能を使用しているときは、このようにして明白です。

関連する問題