UI -Element für eine Infinite Scrolling -Bildergalerie für 100K -Bilder: Welche Datenstruktur?Python

Python-Programme
Anonymous
 UI -Element für eine Infinite Scrolling -Bildergalerie für 100K -Bilder: Welche Datenstruktur?

Post by Anonymous »

Ich erstelle eine (unendliche) scrollbare GUI, die 100x100px Thumbnails aus möglicherweise 100 000 Bilddateien (JPG) in Python tkinter . funktioniert: < /p>

Verwenden von Lazy Loading: Es lädt 30 neue Bilder neu, wenn die Scrollbar das Ende erreicht, , aber aber Es wird nicht skaliert, wenn Sie 100K -Bilder durchsuchen, da das Objekt Canvas immer größer und größer und überlaufend wird.
Welches UI -Element soll dafür verwendet werden? Gibt es einen tk.frame oder tk.canvas , in dem Sie unten neue Inhalte hinzufügen können (z. y = 0..5 000 ) und dann die Leinwand verkleinern, z. B. entfernen /> oder vielleicht eine Leinwand -Frame -Datenstruktur, die "zyklen" wie ein kreisförmiger Puffer? Dies würde vermeiden, dass die Höhe der Leinwand explodiert und immer 10 000 Pixel hoch bleibt. Wenn wir y = 9 000 erreichen, werden alte Bilder bei y = 0..1 000 durch neue ersetzt, und wenn wir bei y = 10 000 in der Tat scrollen Zurück zu y = 0 . Gibt es das? /> oder vielleicht ein anderes System mit Fliesen? (Aber ich sehe nicht wie) < /p>
Hinweise: < /p>

Viele Bildzuschauer mögen Google Picasa ( Freeware Long Decontined) Tun Sie Folgendes:
< /p>
Beachten Sie, dass die rechte vertikale Bildlaufleiste den eigentlichen Fortschritt nicht widerspiegelt < /p>
< /li>
< /ul>
Code: < /p>

Code: Select all

import os, tkinter as tk, tkinter.ttk as ttk, PIL.Image, PIL.ImageTk
class InfiniteScrollApp(tk.Tk):
def __init__(self, image_dir, *args, **kwargs):
super().__init__(*args, **kwargs)
self.geometry("800x600")
self.image_files = [os.path.join(root, file) for root, dirs, files in os.walk(image_dir) for file in files if file.lower().endswith(('.jpg', '.jpeg'))]
self.image_objects = []
self.canvas = tk.Canvas(self, bg="white")
self.scrollbar = ttk.Scrollbar(self, orient="vertical", command=self.yview)
self.canvas.configure(yscrollcommand=self.scrollbar.set)
self.scrollbar.pack(side="right", fill="y")
self.canvas.pack(side="left", fill="both", expand=True)
self.frame = tk.Frame(self.canvas, width=self.canvas.winfo_width())
self.canvas.create_window((0, 0), window=self.frame, anchor="nw")
self.canvas.bind_all("", self.on_scroll)
self.load_images()
def yview(self, *args):
self.canvas.yview(*args)
self.update()
def update(self):
canvas_height = self.canvas.bbox("all")[3]
scroll_pos = self.canvas.yview()[1]
if scroll_pos > 0.9:
self.load_images()
def load_images(self):
current_image_count = len(self.image_objects)
for i in range(current_image_count, current_image_count + 30):
if i < len(self.image_files):
image_path = self.image_files[i]
img = PIL.Image.open(image_path)
img.thumbnail((100, 100))
photo = PIL.ImageTk.PhotoImage(img)
label = tk.Label(self.frame, image=photo)
label.image = photo
label.pack(pady=5, padx=10)
self.image_objects.append(label)
self.frame.update_idletasks()
self.canvas.config(scrollregion=self.canvas.bbox("all"))
def on_scroll(self, event):
self.canvas.yview_scroll(-1 * (event.delta // 120), "units")
self.update()
app = InfiniteScrollApp("D:\images")
app.mainloop()
< /code>

 Beispielbilder < /h2>
Beispielcode zum Erstellen von 10K -Bildern schnell mit einer darauf gezeichneten Textnummer: < /p >
 
 
from PIL import Image, ImageDraw, ImageFont
import random
for i in range(10000):
img = Image.new('RGB', (200, 200), (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)))
draw = ImageDraw.Draw(img)
font = ImageFont.truetype("arial.ttf", 30)
draw.text((10, 10), str(i), font=font, fill=(0, 0, 0))
img.save(f'color_image_{i:04d}.jpg')

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post