9

データベースの内容を 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

水平スクロールと垂直スクロールを同時に機能させるか、別の解決策を見つける必要があります。

4

1 に答える 1

15

スクロールバーの動作を妨げるコードは見当たりません。スクロールバーの 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 つ目は、この場合、目的の効果を得るために必要な明らかな理由だけでなく、サイズ変更動作が正しくなるためです。この回答で理由を説明するためにトピックから外れているので、詳細についてはスタックオーバーフローでこの回答を読んでください。

第 2 に、スクロールバーを操作するとき、プロフェッショナルな外観が必要な場合は、グリッドを使用するのが最善です。pack を使用する場合、スクロールバーは、それらが交わるコーナーでプロパティを整列しません。右下隅に小さな空白スペースを入れて、次のように表示します。

  ||
==

ただし、 pack を使用すると、次のいずれかのようになります。

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

最後に、そうしない ことをお勧めしますimport *。後で問題が発生する可能性があります。import Tkinter as tk代わりに、すべての tk コマンドの前に「tk」を付けて実行する習慣を身につけてください。(例:tk.Canvasなど)。同じ UI で ttk ウィジェットと tkinter ウィジェットを初めて混在させようとすると、これが問題になる理由がわかりますが、他のパッケージからも「* をインポート」すると、他の場所で問題が発生する可能性があります。さらに、この方法では、tk 機能を使用しているときと、他のパッケージの機能を使用しているときは明らかです。

于 2012-03-05T12:07:49.393 に答える