> 백엔드 개발 > 파이썬 튜토리얼 > 특히 로그 파일 데이터에서 생성된 많은 수의 레이블을 처리할 때 Tkinter의 위젯 그룹에 스크롤바를 어떻게 추가할 수 있습니까?

특히 로그 파일 데이터에서 생성된 많은 수의 레이블을 처리할 때 Tkinter의 위젯 그룹에 스크롤바를 어떻게 추가할 수 있습니까?

DDD
풀어 주다: 2024-12-26 21:16:15
원래의
319명이 탐색했습니다.

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 좌표는 각 열의 가장 넓은 항목을 기준으로 고정된 상태로 유지됩니다. 열별로 항목에 태그를 지정하면 단일 명령을 통해 열 내의 모든 항목을 조정할 수 있습니다.

객체 지향 솔루션

다음은 프레임 내장 캔버스의 객체 지향 구현입니다. 해결책:

import tkinter as 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=&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>
<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=&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()
캔버스 = tk.Canvas(root, borderwidth=0, background="#ffffff")
frame = tk.Frame(canvas, background="#ffffff")
vsb = tk.Scrollbar(root, orient="수직", 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, 앵커="nw")

frame.bind("", 람다 이벤트, canvas=canvas: onFrameConfigure(캔버스))

채우기(프레임)

root.mainloop()

위 내용은 특히 로그 파일 데이터에서 생성된 많은 수의 레이블을 처리할 때 Tkinter의 위젯 그룹에 스크롤바를 어떻게 추가할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
이전 기사:Python에서 바이너리 파일을 바이트 단위로 효율적으로 읽으려면 어떻게 해야 합니까? 다음 기사:Python에서 중첩 루프를 효율적으로 중단하려면 어떻게 해야 합니까?
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
최신 이슈
관련 주제
더>
인기 추천
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿