Python ткинтер, как отобразить изображение в реальном времени?

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

0
задан Jan Kowalski 5 April 2019 в 15:27
поделиться

1 ответ

Во-первых: вы не можете изменить расширение .png на .gif, чтобы получить файл GIF. Вам придется использовать какую-то программу для его преобразования. Но Image.open может работать с файлами PNG, поэтому вам не нужно конвертировать его.

 img = ImageTk.PhotoImage(Image.open("furas.png"))

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

 la.image = img

Подробнее в документации: PhotoImage на effbot.org

Третье: вы запустили код в терминале, чтобы увидеть ошибку Сообщения ? Вы забыли импортировать subprocess

Полный код с существующим изображением

from tkinter import *
from PIL import ImageTk, Image
import subprocess

def callback(event):
    subprocess.call("wget https://blog.furas.pl/theme/images/me/furas.png", shell=True)
    img = ImageTk.PhotoImage(Image.open("furas.png"))
    la.configure(image=img)
    la.image = img

root = Tk()
root.title("My app")
root.geometry("680x500+0+0")

b1 = Button(root, text="b1", bg="red")
b1.grid(row=0, column=0)

b2 = Button(root, text="b2", bg="blue")
b2.grid(row=0, column=1)

la = Label(root, text="hi")
la.grid(row=1, column=0)

b2.bind("<Button-1>", callback)

root.mainloop()

Кстати: вы можете использовать Button(..., command=callback), но удалить event из def callback()

from tkinter import *
from PIL import ImageTk, Image
import subprocess

def callback():
    subprocess.call("wget https://blog.furas.pl/theme/images/me/furas.png", shell=True)
    img = ImageTk.PhotoImage(Image.open("furas.png"))
    la.configure(image=img)
    la.image = img

root = Tk()
root.title("My app")
root.geometry("680x500+0+0")

b1 = Button(root, text="b1", bg="red")
b1.grid(row=0, column=0)

b2 = Button(root, text="b2", bg="blue", command=callback)
b2.grid(row=0, column=1)

la = Label(root, text="hi")
la.grid(row=1, column=0)

root.mainloop()

РЕДАКТИРОВАТЬ: вместо wget вы можете использовать стандартный модуль Python urllib и функцию urllib.request.urlretrive()

from tkinter import *
from PIL import ImageTk, Image
import urllib.request

def callback():
    urllib.request.urlretrieve("https://blog.furas.pl/theme/images/me/furas.png", "furas.png")
    img = ImageTk.PhotoImage(Image.open("furas.png"))
    la.configure(image=img)
    la.image = img

root = Tk()
root.title("My app")
root.geometry("680x500+0+0")

b1 = Button(root, text="b1", bg="red")
b1.grid(row=0, column=0)

b2 = Button(root, text="b2", bg="blue", command=callback)
b2.grid(row=0, column=1)

la = Label(root, text="hi")
la.grid(row=1, column=0)

root.mainloop()
0
ответ дан furas 5 April 2019 в 15:27
поделиться
Другие вопросы по тегам:

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