Вопрос по python – Почему фотоизображение ставится медленно?

6

При манипулировании объектами фотоизображения, с помощью:

<code>import tkinter as tk

img = tk.PhotoImage(file="myFile.gif")
for x in range(0,1000):
  for y in range(0,1000):
    img.put("{red}", (x, y))
</code>

операция put занимает очень много времени. Есть ли более быстрый способ сделать это?

Я бы сказал, что это, вероятно, не толькоput() вызовите это медленно, но тот факт, что вы делаете вложенный цикл for (1000 ^ 2), который очень медленный. Но у @soulcheck есть правильный ответ для вас. jdi

Ваш Ответ

3   ответа
3

to необязательный параметрput() команды достаточно, нет необходимости создавать сложную строку:

import tkinter as tk
root = tk.Tk()

img = tk.PhotoImage(width=1000, height=1000)
data = 'red'
img.put(data, to=(0, 0, 1000, 1000))
label = tk.Label(root, image=img).pack()

root_window.mainloop()
Further observations

Я не смог найти много документации по PhotoImage, ноto Параметр масштабирует данные гораздо эффективнее, чем стандартный цикл. Вот некоторая информация, которую я бы счел полезной, которая, кажется, не документирована должным образом в Интернете.

data Параметр принимает строку значений цвета, разделенных пробелами, которые имеют имя (официальный список) или 8-битный цветной шестнадцатеричный код. Строка представляет собой массив цветов, которые должны повторяться на пиксель, где строки с более чем одним цветом содержатся в фигурных скобках, а столбцы разделены пробелом. Строки должны иметь одинаковое количество столбцов / цветов.

acceptable:
3 column 2 row: '{color color color} {color color color}'
1 column 2 row: 'color color', 'color {color}'
1 column 1 row: 'color', '{color}'

unacceptable:
{color color} {color}

Если используется именованный цвет, содержащий пробелы, он должен быть заключен в фигурные скобки. то есть. & quot; {dodger blue} & ap;

Вот пара примеров, иллюстрирующих вышесказанное в действии, где потребуется длинная строка:

img = tk.PhotoImage(width=80, height=80)
data = ('{{{}{}}} '.format('{dodger blue} ' * 20, '#ff0000 ' * 20) * 20 +
        '{{{}{}}} '.format('LightGoldenrod ' * 20, 'green ' * 20) * 20)
img.put(data, to=(0, 0, 80, 80))

enter image description here

data = ('{{{}{}}} '.format('{dodger blue} ' * 20, '#ff0000 ' * 10) * 20 +
        '{{{}{}}} '.format('LightGoldenrod ' * 20, 'green ' * 10) * 10)

enter image description here

Error: User Rate Limit Exceededa gistError: User Rate Limit ExceededputError: User Rate Limit Exceededto=.
6

from Tkinter import *
root = Tk()
label = Label(root)
label.pack()
img = PhotoImage(width=300,height=300)
data = ("{red red red red blue blue blue blue}")
img.put(data, to=(20,20,280,280))
label.config(image=img)
root.mainloop()
Error: User Rate Limit Exceeded"{red red red red blue blue blue blue}"Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededthis articleError: User Rate Limit Exceeded
0

put с этим массивом в качестве параметра.

Как это:

import tkinter as tk

img = tk.PhotoImage(file="myFile.gif")
# "#%02x%02x%02x" % (255,0,0) means 'red'
line = '{' + ' '.join(["#%02x%02x%02x" % (255,0,0)] * 1000) + '}'
img.put(' '.join([line] * 1000))
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

Похожие вопросы