纯色无边黑科技 2020-11-28 22:37 采纳率: 0%
浏览 690

Tkinter怎么才能实现for循环呢?

大家好,我还在学习编程语言,遇到了一个问题没能找到解决方案,希望能向有经验的前辈讨教。

  最近接触到了tkinter窗口化的应用,想把自己的图片集(0.jpg,1.jpg,....大约100个)做成能够循环播放的程序。通过button实现。但是通过其他博主的方式,很难做到这个要求,只会将少数个图片单独放进程序里进行逐一显示,并没有采用到for循环,这很不便利。

from tkinter import *
from PIL import Image, ImageTk
import time
import cv2
import os

top = Tk()
top.title('定时更换图片')

# 获取屏幕的宽度和高度,并且在高度上考虑到底部的任务栏,为了是弹出的窗口在屏幕中间
screenwidth = top.winfo_screenwidth()
screenheight = top.winfo_screenheight() - 100

# file = ['image/0.jpg']           #此处的image是我的文件夹,包括下文的list = []
bm1 = ImageTk.PhotoImage(file='image/0.jpg') #bm1 = PhotoImage(file='rest.gif')更改了程序
# bm2 = ImageTk.PhotoImage(file='image/1.jpg') #bm2-bm4是为了最后一段注释的程序进行逐一播放的
# bm3 = ImageTk.PhotoImage(file='image/2.jpg')
# bm4 = ImageTk.PhotoImage(file='image/3.jpg')

list = ['image/0.jpg','image/1.jpg','image/2.jpg','image/3.jpg',
        'image/4.jpg','image/5.jpg','image/6.jpg','image/7.jpg',
        'image/8.jpg','image/9.jpg','image/10.jpg','image/11.jpg',
        'image/12.jpg','image/13.jpg','image/14.jpg','image/15.jpg']

label = Label(top, image=bm1)
label.bm = bm1
i = 0
def changeImage(i):
    for i in range  list[]
#做到这里就不会做了...


#下面这段代码在上面的函数中运行失败了。
    # while i < 100:
    #     i += 1
        # filename = str(i) + '.jpg'
        # if os.path.isfile(filename):
        #     img1 = cv2.imread(filename)
        #     im1 = Image.fromarray(cv2.cvtColor(img1, cv2.COLOR_BGR2RGB))
        #     img = ImageTk.PhotoImage(image=im1)
        #     label.after(1000, changeImage, i)


#通过单独放的几个图片,可以实现循环播放,但是不是采用的for循环,对于多个图片集难以应用。
    # if i % 3 == 1:
    #     label.configure(image = bm1)
    #     i = i + 1
    #     label.after(1000,changeImage,i)
    # elif i % 3 == 2:
    #     label.configure(image=bm2)
    #     i = i + 1
    #     label.after(1000, changeImage,i)
    # else:
    #     label.configure(image=bm3)
    #     i = i + 1
    #     label.after(1000, changeImage, i)
    
label.pack(fill=X,expand=1)
i = i + 1
label.after(1000,changeImage,i)
top.update_idletasks()
top.deiconify()    #now window size was calculated
top.withdraw()     #hide window again
# top.geometry('%sx%s+%s+%s' % (top.winfo_width() + 10, top.winfo_height() + 10, (screenwidth - top.winfo_width())/2,(screenheight - top.winfo_height())/2) )    #center window on desktop

top.deiconify()
top.mainloop()
  • 写回答

1条回答 默认 最新

  • ~白+黑 Python领域新星创作者 2020-11-29 11:16
    关注

    你这个需求没必要用for又用while的,在gui中用while循环会卡死的,既然用了after何必还要循环呢,after完全可以实现循环的效果,而且还可以控制每个图片的展示时间。

    import tkinter
    
    def run():
        #这样就可以实现循环图片,也可以加上控制按一下停止,再按一下继续,
        def scr_ima(i=0):
            lab.config(text="我是图片"+str(i))
            i += 1
            doid = top.after(1000,scr_ima,i)
            if i == len(image_list):#如果i到了列表的结尾.可以从从开始,或者也结束after
                i = 0
                top.after_cancel(doid)
        image_list = [1,2,3,4,5,]#假设为图片列表
        scr_ima()
    
    top = tkinter.Tk()
    flag = False
    lab = tkinter.Label(top,text="我是图片")
    lab.pack()
    tkinter.Button(top,text="循环播放",command= run,).pack()
    top.mainloop()

    希望对你有所帮助

    评论

报告相同问题?

悬赏问题

  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境
  • ¥30 关于#java#的问题,请各位专家解答!
  • ¥30 vue+element根据数据循环生成多个table,如何实现最后一列 平均分合并
  • ¥20 pcf8563时钟芯片不启振
  • ¥20 pip2.40更新pip2.43时报错
  • ¥15 换yum源但仍然用不了httpd