Это последующий вопрос от вызова imageetk.photoimage () в потоке, вызывая тупик < /p>
Я до сих пор исправил проблему тупика после дизайна в принятом ответе. Теперь я работаю над отзывчивым пользовательским интерфейсом, который позволяет пользователю изменять размер окна. По мере изменения размера окна изображение, показанное на метке, также должно изменить размер, чтобы заполнить окно. Тем не менее, я обнаружил, что большие изображения могут значительно повлиять на частоту кадров. Отображение и обновление изображений на мониторе 4K приводит к тому, что пользовательский интерфейс становится индивидуальным.Average delay time: 0.0014089000100102568, image size: 100 x 100
Average delay time: 0.001673793329991895, image size: 200 x 200
Average delay time: 0.0033536416499555344, image size: 400 x 400
Average delay time: 0.02414946045006218, image size: 800 x 800
Average delay time: 0.07494734207000875, image size: 1600 x 1600
Average delay time: 0.1494195945899719, image size: 3200 x 3200
< /code>
Я использую Macbook M3 Pro, так что это не ужасная машина, аналогичные результаты также получены с машины i7. Я достигаю ограничения Python и должен рассмотреть C ++ на данный момент?import tkinter as tk
from PIL import Image, ImageTk
import threading
import time
ITERATION = 20
class Timer:
def __init__(self):
self.reset()
def reset(self):
self.time_accumulated = 0
self.start_time = None
self.count = 0
def begin(self):
self.start_time = time.perf_counter()
def stop(self):
if self.start_time is None:
return
self.time_accumulated += time.perf_counter() - self.start_time
self.count += 1
def get_average_time(self):
return self.time_accumulated / self.count
class App:
def __init__(self, root):
self.root = root
self.label = tk.Label(root)
self.label.pack()
self.running = True
self.frame = None
self.image_size = 100
# run in other thread
self.display_thread = threading.Thread(target=self.update_image_loop, daemon=True)
self.display_thread.start()
self.root.protocol("WM_DELETE_WINDOW", self.on_close)
self.loop_time_previous = time.perf_counter()
self.timer = Timer()
self.root.after(1, self.set_image)
def update_image_loop(self):
"""Run in other thread."""
while self.running:
# self.frame = Image.open(self.image_path)
# make a small black image
self.frame = Image.new('RGB', (self.image_size, self.image_size), (0, 0, 0))
time.sleep(0.001)
def set_image(self):
"""Run in main thread."""
self.timer.stop()
if self.frame:
self.image = ImageTk.PhotoImage(image=self.frame)
self.label.config(image=self.image)
if self.timer.count >= ITERATION:
self.next()
if self.running:
self.timer.begin()
self.root.after(1, self.set_image)
def next(self):
print(f'Average delay time: {self.timer.get_average_time()}, image size: {self.image_size} x {self.image_size}')
self.image_size *= 2
if self.image_size >= 5000:
self.root.destroy()
return
self.timer.reset()
def on_close(self):
self.running = False
self.display_thread.join()
self.root.destroy()
if __name__ == '__main__':
root = tk.Tk()
app = App(root)
root.mainloop()
Подробнее здесь: https://stackoverflow.com/questions/796 ... arge-image
Проблемы с произведениями на метке изображения Tkinter при обновлении большого изображения ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Применить различное форматирование только к одной метке столбца в метке столбца matplotlib
Anonymous » » в форуме Python - 0 Ответы
- 68 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Python – Tkinter, похоже, добавляет дополнительные поля вокруг изображения на метке.
Anonymous » » в форуме Python - 0 Ответы
- 7 Просмотры
-
Последнее сообщение Anonymous
-