Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimanakah saya boleh menambah bar skrol pada kumpulan widget dalam Tkinter, terutamanya apabila berurusan dengan sejumlah besar label yang dijana daripada data fail log?

Bagaimanakah saya boleh menambah bar skrol pada kumpulan widget dalam Tkinter, terutamanya apabila berurusan dengan sejumlah besar label yang dijana daripada data fail log?

DDD
DDDasal
2024-12-26 21:16:15317semak imbas

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?

Menambahkan Bar Tatal pada Kumpulan Widget dalam Tkinter

Tidak dapat memasukkan bar skrol dengan paparan besar label yang dijana daripada log data fail menimbulkan cabaran dalam Tkinter. Isu ini timbul disebabkan oleh pengehadan bar skrol kepada jenis widget tertentu, tidak termasuk yang digunakan untuk memaparkan grid widget.

Berbilang penyelesaian wujud untuk mengatasi pengehadan ini. Untuk paparan menegak atau mendatar yang lebih ringkas, widget teks yang digabungkan dengan kaedah window_create memberikan pilihan yang berdaya maju. Walau bagaimanapun, ini mungkin tidak mencukupi untuk susun atur yang lebih rumit. Kaedah yang lebih komprehensif melibatkan penggunaan widget kanvas dengan bar skrol yang berkaitan. Benamkan bingkai yang mengandungi widget label dalam kanvas ini. Dengan melaraskan pilihan scrollregion untuk memadankan dimensi bingkai, anda mendayakan penatalan widget dengan berkesan.

Menggabungkan widget ke dalam bingkai dan bukannya terus ke dalam kanvas adalah berfaedah kerana bar skrol kanvas hanya boleh memanipulasi item yang dicipta melalui kaedah tertentu. Pembungkusan, peletakan atau pengikatan item ke kanvas tidak dikenali untuk tujuan menatal. Bingkai, walau bagaimanapun, membenarkan kaedah ini dalam hadnya, dan penciptaan tetingkap seterusnya menghasilkan kemasukan bingkai.

Melukis elemen teks terus ke kanvas ialah pilihan lain . Pendekatan ini memerlukan penentuan ketinggian garis fon, yang kemudiannya mentakrifkan koordinat-y untuk setiap item teks. Koordinat X kekal tetap berdasarkan item terluas dalam setiap lajur. Menandai item mengikut lajur membolehkan pelarasan pada semua item dalam lajur melalui satu arahan.

Penyelesaian Berorientasikan Objek

Di bawah ialah pelaksanaan berorientasikan objek bagi bingkai-tertanam-dalam-kanvas penyelesaian:

import tkinter sebagai tk

Contoh kelas(tk.Bingkai):

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(&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;))

jika nama == "__main__":

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

Penyelesaian Prosedur

Berikut ialah penyelesaian alternatif tanpa menggunakan a kelas:

import tkinter sebagai tk

def populate(bingkai):

'''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(kanvas):

'''Reset the scroll region to encompass the inner frame'''
canvas.configure(scrollregion=canvas.bbox(&quot;all&quot;))

akar = tk.Tk()
kanvas = 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("", acara lambda, canvas=canvas: onFrameConfigure(kanvas))

isi(bingkai)

root.mainloop()

Atas ialah kandungan terperinci Bagaimanakah saya boleh menambah bar skrol pada kumpulan widget dalam Tkinter, terutamanya apabila berurusan dengan sejumlah besar label yang dijana daripada data fail log?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn