Я делаю (бесконечный) прокрученный графический интерфейс, который отображает миниатюры 100x100px, возможно, 100 000 изображений, в Python tkinter.
Код MCVE ниже работает:
Используя ленивую загрузку: он перезагружает 30 новых изображений, когда прокрутка достигает конца, Но но но но Он не будет масштабироваться при просмотре 100K -изображений , потому что объект Canvas станет больше и больше и переполненной памятью.
Какой элемент пользовательского интерфейса использовать для этого? Есть ли tk.frame или tk.canvas , в котором вы можете добавить новый контент внизу (например, y = 10 000 ) и уничтожить старый контент вверху (например, в y = 0..5 000 ), а затем уменьшить холст, например, удалить первую половину его (чтобы избежать высоты холста, становятся выше и выше) без графического интерфейса мерцание? Это позволило бы взрываться на высоту холста и всегда оставаться высотой 10 000 пикселей. Когда мы достигаем y = 9 000 , старые изображения на y = 0..1 000 заменяются новыми, и при прокрутке при y = 10 000 на самом деле мы зацикливаемся Вернуться к y = 0 . Существует ли это? /> или, может быть, другая система с плитками? (Но я не вижу, как) < /p>
Примечания: < /p>
Многие зрители изображений, как Google Picasa ( Длинное прекращение бесплатного программного обеспечения) сделайте это:
< /p>
Обратите внимание, что правая вертикальная прокрутка не отражает реального прогресса, потому что ручка прокрутки будет слишком маленькой и неточной для 100 тыс. Изображений - здесь это скорее похожая на джойстик < /p>
< /li>
< /ul>
код: < /p>
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
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()
Подробнее здесь: https://stackoverflow.com/questions/794 ... ich-data-s
Элемент пользовательского интерфейса для бесконечной галереи изображений прокрутки для 100 тыс. Изображений: какая струк ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение