首頁 > 後端開發 > Python教學 > 如何在 Tkinter 中的一組小工具中新增捲軸,特別是在處理從日誌檔案資料產生的大量標籤時?

如何在 Tkinter 中的一組小工具中新增捲軸,特別是在處理從日誌檔案資料產生的大量標籤時?

DDD
發布: 2024-12-26 21:16:15
原創
324 人瀏覽過

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 方法結合提供了一個可行的選擇。然而,這可能不足以滿足更複雜的佈局。更全面的方法涉及使用帶有關聯滾動條的畫布小部件。將包含標籤小工具的框架嵌入到該畫布中。透過調整scrollregion選項以符合框架尺寸,您可以有效地啟用小部件的捲動。

將小部件合併到框架中而不是直接合併到畫布中是有利的,因為畫布滾動條只能操作透過特定方法建立的項目。出於滾動目的,無法識別將項目打包、放置或網格化到畫布上。然而,框架允許在其範圍內使用這些方法,並且後續的視窗建立會導致包含框架。

將文字元素直接繪製到畫布上是另一種選擇。這種方法需要確定字體的行高,隨後定義每個文字項目的 y 座標。 X 座標根據每列中最寬的項目保持固定。按列標記項目可以透過單一指令調整列中的所有項目。

物件導向的解決方案

以下是frame-embedded-in-canvas的物件導向實作解決方案:

導入tkinter as tk<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()
登入後複製

程式解決方案

這是一種不使用的替代解決方案一個類別:

導入tkinter as tk<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, bwidth=00, brootorder , background="#ffffff")
frame = tk.Frame(canvas, background="#ffffff")
vsb = tk.Scrollbar(根,東方=“垂直”, 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(""、lambda 事件、canvas=canvas: onFrameConfigure(canvas))

填充(框架)

root.mainloop()

以上是如何在 Tkinter 中的一組小工具中新增捲軸,特別是在處理從日誌檔案資料產生的大量標籤時?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板