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>
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, [b], aber aber Es wird nicht skaliert, wenn Sie 100K -Bilder [/b] 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]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') [/code]
Nach dem Titel dieses Beitrags scheint mein Problem vielleicht sehr vage zu sein, aber ich konnte mir keine kurze Erklärung für mein Problem einfallen lassen.
Ich erstelle eine WordPress-Website für...
Wie kann man ein Diagramm in Python sauber darstellen? (Von Grund auf neu beginnen, d. h. keine Bibliotheken!)
Welche Datenstruktur (z. B. Diktate/Tupel/Dikt(Tupel)) ist schnell, aber auch...
Ich habe mir die Tries-Datenstruktur angesehen (ich habe sie gefunden, als ich ein Leetcode-Problem gelöst habe).
Soweit ich es verstanden habe, speichern wir in einem Trie die Zeichen eines Wortes...
Ich möchte einen ähnlichen Effekt erstellen, der ähnlich wie diese Website entspricht. Ich habe mehrere Ansätze ausprobiert, aber ich konnte diesen Effekt nicht erreichen.
Meine Website: Hero...