Невозможно отобразить более одного изображения на холсте tkinter - PullRequest
0 голосов
/ 25 октября 2019

Я пытаюсь создать рендеринг изображений в серии по одному. Но, как правило, он показывает последнее изображение, а другие изображения невидимы. Я обнаружил, что существует проблема со ссылочной переменной (cj.img = t), которая остаетсяТо же самое в любое время. Что я должен делать ???

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

#--------------------------------------------------------------------------------------------------

root = Tk()
root.geometry("600x400")

cj = Canvas(root,width = 600,height = 300,relief = SUNKEN,bd = 1,bg = "#494949")
cj.grid(row = 1,column = 0,sticky = "news")

w = 0
imh = ["myphoto.png","new2.png","format.png"]
def showimg():
     for i in range(len(imh)) :
          t = ImageTk.PhotoImage(file = imh[i])
          cj.img = t
          cj.create_image(100,(i * 50),image = t,anchor = N)

showimg()

1 Ответ

1 голос
/ 25 октября 2019

Почти нет. Каждое изображение должно быть определено отдельно, в противном случае изображение t заменяет предыдущее. Поэтому приведенный ниже код должен давать подсказку.

from tkinter import Tk, Canvas, SUNKEN
import PIL
from PIL import Image, ImageTk


root = Tk()
root.geometry('600x400')

cj = Canvas(root, width=600, height=300, relief=SUNKEN, bd=1, bg="#494949")
cj.grid(row=1, column=0, sticky='nesw')

image_files = ['myphoto.png', 'new2.png', 'format.png']
pics = []


def show_img():
    for i, image_file in enumerate(image_files):

          pics.append(ImageTk.PhotoImage(file=image_file))
          cj.create_image(100, i * 50, image=pics[i], anchor='n')

show_img()
root.mainloop()

Советы:

  • Не импортировать *
  • Используйте enumerate () в цикле for для получения индекса iи имя файла
  • Используйте более описательные имена файлов
  • В соответствии с PEP8 добавьте пробел после запятой

Некоторая полезная документация: Виджет холста Tkinter

...