无法使用功能在Tkinter中更新图像

时间:2019-07-16 03:46:20

标签: python python-3.x tkinter

我正在尝试创建一个Tkinter来创建一个使用标签显示图像的窗口,然后使用更新功能来更新图像,但是我要显示的图像并未显示在Tkinter窗口中,出现黑屏

我有两个工作代码

  1. 在Tkinter窗口上显示图像的人
  2. 使用更新函数循环播放GIF的原因

我试图将它们结合起来

我正在处理的代码不起作用

import Audio from './Audio';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faPlay } from '@fortawesome/free-solid-svg-icons';
import { faPause } from '@fortawesome/free-solid-svg-icons';
import { faUndo } from '@fortawesome/free-solid-svg-icons';
import React from 'react';
import PomodoroIcons from './PomodoroIcons';
import DurationControls from './DurationControls';

const TimeFormat = require('hh-mm-ss');

const Timer = props => (

<div className="timer">

  <DurationControls
    breakDuration={props.breakDuration}
    sessionDuration={props.sessionDuration}

    increaseBreakDuration={props.increaseBreakDuration}
    decreaseBreakDuration={props.decreaseBreakDuration}

    increaseSessionDuration={props.increaseSessionDuration}
    decreaseSessionDuration={props.decreaseSessionDuration}
  />

  {/* TIME REMAINING */}
  <p className="time-remaining">
    {props.isSession ? TimeFormat.fromS(props.sessionTimeRemaining) : TimeFormat.fromS(props.breakTimeRemaining)}
  </p>

  {/* PLAY, PAUSE, RESTART BUTTONS */}
  <div className="bottom-btns">

    <div className={props.timerOn ? 'hidden' : ''}>
      <FontAwesomeIcon
        role="button"
        onClick={props.startTimer}
        icon={faPlay}
        className="btn bottom-btn"
        size="4x"
      />
    </div>

    <div className={props.timerOn === false ? 'hidden' : ''}>
      <FontAwesomeIcon
        role="button"
        onClick={props.pauseTimer}
        icon={faPause}
        className="btn bottom-btn"
        size="4x"
      />
    </div>

    <FontAwesomeIcon
      role="button"
      onClick={props.resetTimer}
      icon={faUndo}
      className="btn bottom-btn"
      size="4x"
    />

  </div> {/* End bottom-btns */}

  <PomodoroIcons sessionNumber={props.sessionNumber} />

  {props.playAlarm ? <Audio /> : null}
</div>

);

export default Timer;

我尝试结合的其他代码

1:显示图片的那个

#import GUI
from tkinter import *

#change dir
import os
os.chdir("C:/Users/user/Desktop/test image folder/")

#add delay
import time

#import image
from PIL import Image, ImageTk

#set up the window
window = Tk()
#window.title("modify images")

#list of filename
filelist = []

#loop over all files in the working directory
for filename in os.listdir("."):
    if not (filename.endswith('.png') or filename.endswith('.jpg')):
        continue #skip non-image files and the logo file itself
    filelist = filelist + [filename]

#list of filename
print(filelist)

#show first pic
imagefile = filelist[0]
photo = ImageTk.PhotoImage(Image.open(imagefile))
label1 = Label(window, image = photo)
label1.pack()

#update image
def update(ind):
    imagefile = filelist[ind]
    im = ImageTk.PhotoImage(Image.open(imagefile))
    if ind < len(filelist):
        ind += 1
    else:
        ind = 0
    label1.configure(image=im)
    window.after(2000, update, ind)
window.after(2000, update, 0)

#run the main loop
window.mainloop()

2:updates gif

import tkinter as tk
from tkinter import *
from PIL import Image, ImageTk  # Place this at the end (to avoid any conflicts/errors)


window = tk.Tk()
imagefile = "image.jpg"
img = ImageTk.PhotoImage(Image.open(imagefile))
lbl = tk.Label(window, image = img).pack()
window.mainloop()
print('hi')

我希望它能一一显示文件中的所有图像

它只显示第一张图像,然后窗口变为空白

1 个答案:

答案 0 :(得分:0)

您有问题,因为PhotoImage中存在错误。如果在函数中创建它并分配给局部变量,那么Garbage Collector会从内存中删除图像,并且会看到空图像。您必须在外部函数中创建PhotoImages,或者必须将其分配给某些全局变量。

受欢迎的解决方案是将其分配给将显示它的标签。

label.im = im

功能:

def update(ind):
    imagefile = filelist[ind]
    im = ImageTk.PhotoImage(Image.open(imagefile))

    if ind < len(filelist):
        ind += 1
    else:
        ind = 0

    label1.configure(image=im)

    label1.im = im  # <-- solution

    window.after(2000, update, ind)

文档:PhotoImage