Хотел сделать мгновенный режим но больше нет желания ебаться с этим говном выбиратора.. Да, и нет у меня такой цели...
Код:
import os
import random
import threading
import time
import numpy as np
import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk
class ImageDisplayWindow(tk.Toplevel):
def __init__(self, master):
super().__init__(master)
self.title("Облако изображений")
self.canvas = tk.Canvas(self, width=800, height=600, bg='white')
self.canvas.pack()
self.images_tk = []
def show_images(self, images, rows):
self.canvas.delete("all")
width, height = 100, 100
spacing = 2
total_images = len(images)
images_per_row = total_images // rows
remainder = total_images % rows
index = 0
self.images_tk.clear()
for row in range(rows):
count_in_row = images_per_row + (1 if row < remainder else 0)
for col in range(count_in_row):
if index >= total_images:
break
img = images[index]
if img is not None:
pil_img = Image.fromarray(img)
pil_img = pil_img.resize((width, height))
img_tk = ImageTk.PhotoImage(pil_img)
x = col * (width + spacing)
y = row * (height + spacing)
self.canvas.create_image(x, y, anchor='nw', image=img_tk)
self.images_tk.append(img_tk)
index += 1
class ImageShuffler:
def __init__(self, root):
self.root = root
self.root.title("Управление изображениями")
self.images = []
self.display_window = None
self.thread = None
self.running = False
self.auto_mode = False
tk.Button(root, text="Выбрать папку", command=self.select_folder).pack(pady=5)
self.speed_var = tk.StringVar(value="1.0")
tk.Label(root, text="Скорость (сек):").pack()
tk.Entry(root, textvariable=self.speed_var, width=5).pack()
tk.Label(root, text="Количество изображений в ряду:").pack()
self.count_var = tk.IntVar(value=5)
tk.Entry(root, textvariable=self.count_var, width=5).pack()
tk.Label(root, text="Количество рядов:").pack()
self.rows_var = tk.IntVar(value=3)
tk.Entry(root, textvariable=self.rows_var, width=5).pack()
self.mode_frame = tk.Frame(root)
self.mode_frame.pack(pady=5)
self.mode_var = tk.StringVar(value="instant")
tk.Radiobutton(self.mode_frame, text="Мгновенно", variable=self.mode_var, value="instant").pack(side='left', padx=5)
tk.Radiobutton(self.mode_frame, text="Поочередно", variable=self.mode_var, value="sequential").pack(side='left', padx=5)
control_frame = tk.Frame(root)
control_frame.pack(pady=5)
tk.Button(control_frame, text="Запуск", command=self.start).pack(side='left', padx=5)
tk.Button(control_frame, text="Стоп", command=self.stop).pack(side='left', padx=5)
tk.Button(control_frame, text="Открыть окно изображений", command=self.open_display_window).pack(side='left', padx=5)
def select_folder(self):
folder = filedialog.askdirectory(title="Выберите папку")
if folder:
self.images = [os.path.join(folder, f) for f in os.listdir(folder)
if f.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.gif'))]
if self.images:
self.start()
def open_display_window(self):
if self.display_window is None or not self.display_window.winfo_exists():
self.display_window = ImageDisplayWindow(self.root)
def load_image(self, path):
try:
img = Image.open(path)
img = img.convert("RGB")
return np.array(img)
except:
return None
def update_images(self, images):
if self.display_window and self.display_window.winfo_exists():
rows = self.rows_var.get()
self.display_window.show_images(images, rows)
def run_instant_mode(self):
total = self.count_var.get() * self.rows_var.get()
imgs = []
for _ in range(total):
path = random.choice(self.images)
img = self.load_image(path)
imgs.append(img)
self.update_images(imgs)
def run_sequential_mode(self):
self.running = True
while self.running:
total = self.count_var.get() * self.rows_var.get()
imgs = []
for _ in range(total):
path = random.choice(self.images)
img = self.load_image(path)
imgs.append(img)
self.update_images(imgs)
try:
speed = float(self.speed_var.get())
if speed <= 0:
speed = 0.1
except:
speed = 1.0
time.sleep(speed)
def auto_instant_mode(self):
"""Автоматически обновлять изображения через интервал."""
self.auto_mode = True
while self.auto_mode:
self.run_instant_mode()
try:
speed = float(self.speed_var.get())
if speed <= 0:
speed = 0.1
except:
speed = 1.0
time.sleep(speed)
def start(self):
self.stop()
if not self.images:
return
mode = self.mode_var.get()
if mode == "instant":
self.auto_mode = True
self.thread = threading.Thread(target=self.auto_instant_mode, daemon=True)
self.thread.start()
else:
self.thread = threading.Thread(target=self.run_sequential_mode, daemon=True)
self.thread.start()
def stop(self):
self.auto_mode = False
self.running = False
if hasattr(self, 'thread') and self.thread and self.thread.is_alive():
self.thread.join()
def change_mode(self):
if self.mode_var.get() == "instant":
self.start()
else:
self.stop()
root = tk.Tk()
app = ImageShuffler(root)
root.mainloop()
Может есть у кого какие идеи как решить эту проблему...