ログから生成されたラベルの大きな表示を備えたスクロールバーを組み込むことができませんTkinter ではファイル データが課題となります。この問題は、ウィジェットのグリッドの表示に使用されるものを除く、スクロールバーが特定のウィジェット タイプに制限されているために発生します。
この制限を克服する解決策は複数あります。より単純な垂直または水平表示の場合は、テキスト ウィジェットと window_create メソッドを組み合わせることが実行可能なオプションになります。ただし、より複雑なレイアウトの場合はこれでは不十分な場合があります。より包括的な方法には、スクロールバーが関連付けられたキャンバス ウィジェットを使用することが含まれます。ラベル ウィジェットを含むフレームをこのキャンバス内に埋め込みます。フレームの寸法に一致するようにスクロール領域オプションを調整すると、ウィジェットのスクロールが効果的に有効になります。
ウィジェットをキャンバスに直接組み込むのではなく、フレームに組み込むと、キャンバス スクロールバーが有効になるため有利です。特定の方法で作成されたアイテムのみを操作できます。キャンバスへの項目のパッケージ化、配置、またはグリッド化は、スクロール目的では認識されません。ただし、フレームではその範囲内でこれらのメソッドが可能であり、その後のウィンドウ作成にはフレームが組み込まれます。
テキスト要素をキャンバスに直接描画することも別のオプションです。 。このアプローチでは、フォントの行の高さを決定する必要があり、その後、各テキスト項目の y 座標が定義されます。 X 座標は、各列の最も幅の広い項目に基づいて固定されたままになります。列ごとにアイテムにタグを付けると、1 つのコマンドで列内のすべてのアイテムを調整できるようになります。
以下は、frame-embedded-in-canvas のオブジェクト指向実装です。解決策:
tkinter を tk</p> <p>class としてインポート 例(tk.Frame):</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">def __init__(self, parent): tk.Frame.__init__(self, parent) self.canvas = tk.Canvas(self, borderwidth=0, background="#ffffff") self.frame = tk.Frame(self.canvas, background="#ffffff") self.vsb = tk.Scrollbar(self, orient="vertical", command=self.canvas.yview) self.canvas.configure(yscrollcommand=self.vsb.set) self.vsb.pack(side="right", fill="y") self.canvas.pack(side="left", fill="both", expand=True) self.canvas.create_window((4,4), window=self.frame, anchor="nw", tags="self.frame") self.frame.bind("<Configure>", self.onFrameConfigure) self.populate() def populate(self): '''Put in some fake data''' for row in range(100): tk.Label(self.frame, text="%s" % row, width=3, borderwidth="1", relief="solid").grid(row=row, column=0) t="this is the second column for row %s" %row tk.Label(self.frame, text=t).grid(row=row, column=1) def onFrameConfigure(self, event): '''Reset the scroll region to encompass the inner frame''' self.canvas.configure(scrollregion=self.canvas.bbox("all"))
if name == "__main__":
root=tk.Tk() example = Example(root) example.pack(side="top", fill="both", expand=True) root.mainloop()
を使用しない代替解決策は次のとおりです。あるclass:
import tkinter as tk</p> <p>def Populate(frame):</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">'''Put in some fake data''' for row in range(100): tk.Label(frame, text="%s" % row, width=3, borderwidth="1", relief="solid").grid(row=row, column=0) t="this is the second column for row %s" %row tk.Label(frame, text=t).grid(row=row, column=1)
def onFrameConfigure(canvas):
'''Reset the scroll region to encompass the inner frame''' canvas.configure(scrollregion=canvas.bbox("all"))
ルート = tk.Tk()
canvas = tk.Canvas(root, borderwidth=0, background="#ffffff")
frame = tk.Frame(canvas, background="#ffffff")
vsb = tk.Scrollbar(root, orient="vertical", command=canvas.yview)
canvas.configure(yscrollcommand=vsb.set)
vsb.pack(side="right", fill="y")
canvas.pack(side="left", fill="both", Expand=True)
canvas.create_window(( 4,4)、window=frame、anchor="nw")
frame.bind("
populate(frame)
root.mainloop()
以上が特にログ ファイル データから生成された多数のラベルを扱う場合、Tkinter のウィジェットのグループにスクロールバーを追加するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。