ホームページ >バックエンド開発 >Python チュートリアル >特にログ ファイル データから生成された多数のラベルを扱う場合、Tkinter のウィジェットのグループにスクロールバーを追加するにはどうすればよいですか?

特にログ ファイル データから生成された多数のラベルを扱う場合、Tkinter のウィジェットのグループにスクロールバーを追加するにはどうすればよいですか?

DDD
DDDオリジナル
2024-12-26 21:16:15317ブラウズ

How can I add a scrollbar to a group of widgets in Tkinter, especially when dealing with a large number of labels generated from log file data?

Tkinter のウィジェットのグループにスクロールバーを追加

ログから生成されたラベルの大きな表示を備えたスクロールバーを組み込むことができませんTkinter ではファイル データが課題となります。この問題は、ウィジェットのグリッドの表示に使用されるものを除く、スクロールバーが特定のウィジェット タイプに制限されているために発生します。

この制限を克服する解決策は複数あります。より単純な垂直または水平表示の場合は、テキスト ウィジェットと window_create メソッドを組み合わせることが実行可能なオプションになります。ただし、より複雑なレイアウトの場合はこれでは不十分な場合があります。より包括的な方法には、スクロールバーが関連付けられたキャンバス ウィジェットを使用することが含まれます。ラベル ウィジェットを含むフレームをこのキャンバス内に埋め込みます。フレームの寸法に一致するようにスクロール領域オプションを調整すると、ウィジェットのスクロールが効果的に有効になります。

ウィジェットをキャンバスに直接組み込むのではなく、フレームに組み込むと、キャンバス スクロールバーが有効になるため有利です。特定の方法で作成されたアイテムのみを操作できます。キャンバスへの項目のパッケージ化、配置、またはグリッド化は、スクロール目的では認識されません。ただし、フレームではその範囲内でこれらのメソッドが可能であり、その後のウィンドウ作成にはフレームが組み込まれます。

テキスト要素をキャンバスに直接描画することも別のオプションです。 。このアプローチでは、フォントの行の高さを決定する必要があり、その後、各テキスト項目の y 座標が定義されます。 X 座標は、各列の最も幅の広い項目に基づいて固定されたままになります。列ごとにアイテムにタグを付けると、1 つのコマンドで列内のすべてのアイテムを調整できるようになります。

オブジェクト指向ソリューション

以下は、frame-embedded-in-canvas のオブジェクト指向実装です。解決策:

tkinter を tk</p>
<p>class としてインポート 例(tk.Frame):</p>
<pre class="brush:php;toolbar:false">def __init__(self, parent):

    tk.Frame.__init__(self, parent)
    self.canvas = tk.Canvas(self, borderwidth=0, background=&quot;#ffffff&quot;)
    self.frame = tk.Frame(self.canvas, background=&quot;#ffffff&quot;)
    self.vsb = tk.Scrollbar(self, orient=&quot;vertical&quot;, command=self.canvas.yview)
    self.canvas.configure(yscrollcommand=self.vsb.set)

    self.vsb.pack(side=&quot;right&quot;, fill=&quot;y&quot;)
    self.canvas.pack(side=&quot;left&quot;, fill=&quot;both&quot;, expand=True)
    self.canvas.create_window((4,4), window=self.frame, anchor=&quot;nw&quot;,
                              tags=&quot;self.frame&quot;)

    self.frame.bind(&quot;<Configure>&quot;, self.onFrameConfigure)

    self.populate()

def populate(self):
    '''Put in some fake data'''
    for row in range(100):
        tk.Label(self.frame, text=&quot;%s&quot; % row, width=3, borderwidth=&quot;1&quot;,
                 relief=&quot;solid&quot;).grid(row=row, column=0)
        t=&quot;this is the second column for row %s&quot; %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(&quot;all&quot;))

if name == "__main__":

root=tk.Tk()
example = Example(root)
example.pack(side=&quot;top&quot;, fill=&quot;both&quot;, expand=True)
root.mainloop()

手続き的解決策

を使用しない代替解決策は次のとおりです。あるclass:

import tkinter as tk</p>
<p>def Populate(frame):</p>
<pre class="brush:php;toolbar:false">'''Put in some fake data'''
for row in range(100):
    tk.Label(frame, text=&quot;%s&quot; % row, width=3, borderwidth=&quot;1&quot;, 
             relief=&quot;solid&quot;).grid(row=row, column=0)
    t=&quot;this is the second column for row %s&quot; %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(&quot;all&quot;))

ルート = 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(""、ラムダ イベント、 Canvas=canvas: onFrameConfigure(canvas))

populate(frame)

root.mainloop()

以上が特にログ ファイル データから生成された多数のラベルを扱う場合、Tkinter のウィジェットのグループにスクロールバーを追加するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。