280 개 이상의 요소가있는 캔버스에 포함 된 Tkinter 그리드의 예기치 않은 동작

마크 P.

썸네일의 내용에 따라 여러 개의 썸네일을 표시하고 다른 작업을 할 수 있기를 바랍니다. 이를 위해 Tkinter의 위젯 그룹에 스크롤바 추가 의 예제를 가져 와서 첫 번째 열에 레이블을, 포함 된 그리드의 두 번째 열에 이미지를 넣었습니다. 샘플 썸네일로이 이미지를 다운로드 하고 이름을 160x120.jpg.

import Tkinter as tk
from PIL import Image, ImageTk

class Example(tk.Frame):
    def __init__(self, root):

        tk.Frame.__init__(self, root)
        self.canvas = tk.Canvas(root, borderwidth=0, background="#ffffff")
        self.frame = tk.Frame(self.canvas, background="#ffffff")
        self.vsb = tk.Scrollbar(root, 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.photos = []
        self.imgs = []
        self.images = []
        self.lbls = []

        self.populate()

    def populate(self):
        '''Put in some fake data'''

        # n_thumbs = 100 : As expected, one label and one image per row.
        # n_thumbs = 300 : Images are only displayed up to the 278th.
        # n_thumbs = 600 : Just 63 images are displayed. Two labels per row.

        n_thumbs = 100

        for i in range(n_thumbs):
            lbl = tk.Label(self.frame, text="img " + str(i), width=10)
            lbl.grid(row=i, column=0)
            photo = Image.open("160x120.jpg")
            img = ImageTk.PhotoImage(photo)
            image = tk.Label(self.frame, image=img)
            image.grid(row=i, column=1)
            self.lbls.append(lbl)
            self.photos.append(photo)
            self.images.append(image)
            self.imgs.append(img)

    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(root).pack(side="top", fill="both", expand=True)
    root.mainloop()

이제를 설정 n_thumbs = 100하면 모든 것이 예상대로 작동합니다. 즉, 행당 하나의 레이블과 하나의 이미지가 있습니다.

를 설정 n_thumbs = 300하면 목록이 갑자기 278 번째 이미지로 끝납니다.

을 설정 n_thumbs = 600하면 63 개의 이미지 만 표시되지만 마지막 이미지 이후로 아래로 스크롤 할 수 있습니다. 또한 갑자기 각 행에 두 개의 레이블이 있습니다.

이러한 효과를 어떻게 설명 할 수 있습니까? Tkinter를 사용하여 그리드에 300 개 이상의 이미지를 표시하려면 어떻게해야합니까?

브라이언 오클리

사실은 모르겠지만 제 생각에는 당신이 tk 캔버스의 한계를 초과하고 있다는 것입니다. 120 픽셀 높이의 이미지를 사용하면 포함하는 프레임이 높이 32k (32767) 픽셀을 초과하기 전에 272 개의 이미지를 세로로 표시 할 수 있습니다. 캔버스가 32767x32767보다 클 수 없다는 엄격한 제한이있을 수 있습니다. 또는 좌표가 -32767에서 +32767로 제한 될 수 있습니다. 썸네일 중 일부가 정확히 120 픽셀이 아닌 경우 278 개의 제한을 설명 할 수 있습니다. OSX 시스템에서 약간 다른 제한을 확인했습니다.

다시 말하지만 사실은 모르겠지만 가능성이있는 것 같습니다.

이것이 어려운 제한이라면 약간의 작업으로 한 번에 한 화면 만 표시 할 수 있으며,보기로 스크롤 될 때만 새 이미지를로드 할 수 있습니다 (그리고보기에서 스크롤 된 이미지를 파괴 할 수 있습니다). 그리고 포함 된 프레임을 사용하는 대신 캔버스에 직접 이미지를 그립니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

배열에 푸시 된 개체의 예기치 않은 동작

분류에서Dev

배열에 푸시 된 개체의 예기치 않은 동작

분류에서Dev

Bash : 이스케이프 된 공백이있는 디렉토리를 포함하는 변수를 사용하는 예기치 않은 동작

분류에서Dev

Gmail 스레드 개체의 예기치 않은 동작

분류에서Dev

Tkinter : 초기화 중에 실제 캔버스 크기 가져 오기 ( "sticky"에 의한 자동 확장 포함)

분류에서Dev

바인딩 된 함수의 예기치 않은 동작

분류에서Dev

개체 배열이 포함 된 environmentObject에 액세스 할 때 캔버스 미리보기가 표시되지 않습니다.

분류에서Dev

Apache에서 Drupal 사이트의 예기치 않은 가상 호스트 동작

분류에서Dev

Js에서 문서 개체의 예기치 않은 동작

분류에서Dev

내지도에서 이상한 / 예기치 않은 출력 감소 작업 (1 개의 추가 출력)

분류에서Dev

7 개 이상의 연결이 포함 된 Pentaho 보고서가 pentaho DI 서버에서 작동하지 않습니다.

분류에서Dev

입력 필드가있는 동안 캔버스에서 tkinter 확인란이 작동하지 않습니다.

분류에서Dev

2 개 이상의 "OR"조건이 포함 된 XPath가 작동하지 않습니까?

분류에서Dev

스마트 포인터의 예기치 않은 동작

분류에서Dev

이해에 중첩 된 생성기의 예기치 않은 동작

분류에서Dev

마우스가 두 개의 겹치는 캔버스 위에있을 때 CSS 드롭 다운 메뉴가 작동하지 않음

분류에서Dev

오버로드 된 연산자 "<<"C ++의 예기치 않은 동작

분류에서Dev

Blender Game Engine의 IF 함수에서 예기치 않은 동작

분류에서Dev

Contiki의 printf () 함수에서 예기치 않은 동작

분류에서Dev

목록에 4 개 이상의 요소가 포함되어 있는지 확인하기위한 jQuery 또는 javascript

분류에서Dev

투명 캔버스보기 안드로이드에서 지우개가 작동하지 않습니다.

분류에서Dev

선택기에 2 개의 클래스가 포함 된 경우 IE8에서 background-position이 작동하지 않습니다.

분류에서Dev

Traefik이 노출 된 3 개 이상의 포트에서 작동하지 않음

분류에서Dev

Entity Framework가 컬렉션에 개체를 추가하면 예기치 않은 동작이 발생 함

분류에서Dev

스택의 팝 기능에 예기치 않은 동작이 있습니다.

분류에서Dev

Polymer-요소가있는 페이지에서 Polymer 요소에 포함 된 요소에 대한 작업을 트리거하는 방법은 무엇입니까?

분류에서Dev

캔버스가 기본 이미지 그리기에서 작동하지 않음

분류에서Dev

속성의 데이터로 정의되지 않은 개체가있을 수있는 개체가 포함 된 Javascript 개체 스프레드

분류에서Dev

레이아웃의 HTML 요소 예기치 않은 동작

Related 관련 기사

  1. 1

    배열에 푸시 된 개체의 예기치 않은 동작

  2. 2

    배열에 푸시 된 개체의 예기치 않은 동작

  3. 3

    Bash : 이스케이프 된 공백이있는 디렉토리를 포함하는 변수를 사용하는 예기치 않은 동작

  4. 4

    Gmail 스레드 개체의 예기치 않은 동작

  5. 5

    Tkinter : 초기화 중에 실제 캔버스 크기 가져 오기 ( "sticky"에 의한 자동 확장 포함)

  6. 6

    바인딩 된 함수의 예기치 않은 동작

  7. 7

    개체 배열이 포함 된 environmentObject에 액세스 할 때 캔버스 미리보기가 표시되지 않습니다.

  8. 8

    Apache에서 Drupal 사이트의 예기치 않은 가상 호스트 동작

  9. 9

    Js에서 문서 개체의 예기치 않은 동작

  10. 10

    내지도에서 이상한 / 예기치 않은 출력 감소 작업 (1 개의 추가 출력)

  11. 11

    7 개 이상의 연결이 포함 된 Pentaho 보고서가 pentaho DI 서버에서 작동하지 않습니다.

  12. 12

    입력 필드가있는 동안 캔버스에서 tkinter 확인란이 작동하지 않습니다.

  13. 13

    2 개 이상의 "OR"조건이 포함 된 XPath가 작동하지 않습니까?

  14. 14

    스마트 포인터의 예기치 않은 동작

  15. 15

    이해에 중첩 된 생성기의 예기치 않은 동작

  16. 16

    마우스가 두 개의 겹치는 캔버스 위에있을 때 CSS 드롭 다운 메뉴가 작동하지 않음

  17. 17

    오버로드 된 연산자 "<<"C ++의 예기치 않은 동작

  18. 18

    Blender Game Engine의 IF 함수에서 예기치 않은 동작

  19. 19

    Contiki의 printf () 함수에서 예기치 않은 동작

  20. 20

    목록에 4 개 이상의 요소가 포함되어 있는지 확인하기위한 jQuery 또는 javascript

  21. 21

    투명 캔버스보기 안드로이드에서 지우개가 작동하지 않습니다.

  22. 22

    선택기에 2 개의 클래스가 포함 된 경우 IE8에서 background-position이 작동하지 않습니다.

  23. 23

    Traefik이 노출 된 3 개 이상의 포트에서 작동하지 않음

  24. 24

    Entity Framework가 컬렉션에 개체를 추가하면 예기치 않은 동작이 발생 함

  25. 25

    스택의 팝 기능에 예기치 않은 동작이 있습니다.

  26. 26

    Polymer-요소가있는 페이지에서 Polymer 요소에 포함 된 요소에 대한 작업을 트리거하는 방법은 무엇입니까?

  27. 27

    캔버스가 기본 이미지 그리기에서 작동하지 않음

  28. 28

    속성의 데이터로 정의되지 않은 개체가있을 수있는 개체가 포함 된 Javascript 개체 스프레드

  29. 29

    레이아웃의 HTML 요소 예기치 않은 동작

뜨겁다태그

보관