鱼C论坛

 找回密码
 立即注册
查看: 1719|回复: 5

[已解决]利用tkinter设计进度条以及任务完成弹窗

[复制链接]
发表于 2021-12-7 21:57:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
各位老师,大家晚上好!我写了一个小脚本用来批量把图片的像素尺寸缩小到原来的一半,利用tkinter设计了一个简单的交互界面,因为是批量处理,我想设计一个进度条用来跟踪循环体的进度,同时希望完成之后出来一个弹出窗口告诉用户已经处理完成,因为刚刚接触Python,可否请各位老师帮忙一下,非常感谢!
import os
from PIL import Image, ImageEnhance
import PIL
import tkinter
import tkinter.filedialog
import tkinter.messagebox

class Window():
    def __init__(self):
        self.root = root = tkinter.Tk()

        self.label = tkinter.Label(root, text='选择目录')
        self.label.grid(row=3, column=0)
        self.entryDir = tkinter.Entry(root)
        self.entryDir.grid(row=3, column=1)
        self.BrowserDirButton = tkinter.Button(root, text='浏览', command=self.BrowserDir)
        self.BrowserDirButton.grid(row=3, column=2)

        self.ButtonCov = tkinter.Button(root, text='开始处理', command=self.Conv, )
        self.ButtonCov.grid(row=4, column=0)
        
    def BrowserDir(self):
        directory = tkinter.filedialog.askdirectory(title='Python')
        if directory:
            self.entryDir.delete(0, tkinter.END)
            self.entryDir.insert(tkinter.END, directory)

    def Conv(self):
        path = self.entryDir.get()
        for file in os.listdir(path):
            if file[-4:] in ('.bmp', '.jpg', 'jpeg','.gif', '.png', '.BMP', '.JPG', 'JPGE','.GIF', '.PNG'):
                f_img = path + "/" + file
                image = Image.open(f_img)
                newwidth = int(image.size[0] / 2)
                newheight = int(image.size[1] / 2)
                image = image.resize((newwidth, newheight), PIL.Image.NEAREST)
                image.save(f_img)
    
    def mainloop(self):
        self.root.minsize(330, 190)
        self.root.maxsize(330, 170)
        self.root.title('图片批量处理器')
        self.root.mainloop()


if __name__ == "__main__":
    window = Window()
    window.mainloop()
最佳答案
2021-12-14 18:20:43
import os
from PIL import Image, ImageEnhance
import PIL
import tkinter
import tkinter.filedialog
import tkinter.messagebox

from tkinter.ttk import Progressbar
from time import sleep
from threading import Thread

class Window():
    def __init__(self):
        self.root = root = tkinter.Tk()

        self.label = tkinter.Label(root, text='选择目录')
        self.label.grid(row=3, column=0)
        self.entryDir = tkinter.Entry(root)
        self.entryDir.grid(row=3, column=1)
        self.BrowserDirButton = tkinter.Button(root, text='浏览', command=self.BrowserDir)
        self.BrowserDirButton.grid(row=3, column=2)

        self.ButtonCov = tkinter.Button(root, text='开始处理', command=self.Conv, )
        self.ButtonCov.grid(row=4, column=0)
        
    def BrowserDir(self):
        directory = tkinter.filedialog.askdirectory(title='Python')
        if directory:
            self.entryDir.delete(0, tkinter.END)
            self.entryDir.insert(tkinter.END, directory)

    def Conv(self):
        path = self.entryDir.get()
        def _prog():
            top = tkinter.Toplevel(self.root)
            top.attributes("-toolwindow", 1)
            top.attributes("-topmost", 1)
            top.title("进度条")
            tkinter.Label(top, text="正在处理图片,请稍候…").pack()
            prog = Progressbar(top, mode="indeterminate")
            prog.pack()
            prog.start()
            
            for file in os.listdir(path):
                if file[-4:] in ('.bmp', '.jpg', 'jpeg','.gif', '.png', '.BMP', '.JPG', 'JPGE','.GIF', '.PNG'):
                    f_img = path + "/" + file
                    image = Image.open(f_img)
                    newwidth = int(image.size[0] / 2)
                    newheight = int(image.size[1] / 2)
                    image = image.resize((newwidth, newheight), PIL.Image.NEAREST)
                    image.save(f_img)
                    sleep(0.5)
            prog.stop()
            top.destroy()
            tkinter.messagebox.showinfo("提示:", "已完成!")
        t = Thread(target=_prog)
        t.start()
    
    def mainloop(self):
        self.root.minsize(330, 190)
        self.root.maxsize(330, 170)
        self.root.title('图片批量处理器')
        self.root.mainloop()


if __name__ == "__main__":
    window = Window()
    window.mainloop()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-8 09:33:52 | 显示全部楼层
我觉得最好的办法,就是
for file in os.listdir(path):
在这边改成枚举  enumerate
然后在循环里面动态的比较百分比。 并且更新一个进度条的控件。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-8 10:06:59 | 显示全部楼层
z5560636 发表于 2021-12-8 09:33
我觉得最好的办法,就是
  在这边改成枚举  enumerate
然后在循环里面动态的比较百分比。 并且更新一个 ...

谢谢您的解答,因为我对Python语法还不太熟悉,可否帮我的代码修改一下呢(我想把进度条放在“开始执行”按钮的下面)?非常感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-8 21:16:14 | 显示全部楼层
自己顶一下,希望有经验的老师帮忙加入一个进度条,谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-14 18:20:43 | 显示全部楼层    本楼为最佳答案   
import os
from PIL import Image, ImageEnhance
import PIL
import tkinter
import tkinter.filedialog
import tkinter.messagebox

from tkinter.ttk import Progressbar
from time import sleep
from threading import Thread

class Window():
    def __init__(self):
        self.root = root = tkinter.Tk()

        self.label = tkinter.Label(root, text='选择目录')
        self.label.grid(row=3, column=0)
        self.entryDir = tkinter.Entry(root)
        self.entryDir.grid(row=3, column=1)
        self.BrowserDirButton = tkinter.Button(root, text='浏览', command=self.BrowserDir)
        self.BrowserDirButton.grid(row=3, column=2)

        self.ButtonCov = tkinter.Button(root, text='开始处理', command=self.Conv, )
        self.ButtonCov.grid(row=4, column=0)
        
    def BrowserDir(self):
        directory = tkinter.filedialog.askdirectory(title='Python')
        if directory:
            self.entryDir.delete(0, tkinter.END)
            self.entryDir.insert(tkinter.END, directory)

    def Conv(self):
        path = self.entryDir.get()
        def _prog():
            top = tkinter.Toplevel(self.root)
            top.attributes("-toolwindow", 1)
            top.attributes("-topmost", 1)
            top.title("进度条")
            tkinter.Label(top, text="正在处理图片,请稍候…").pack()
            prog = Progressbar(top, mode="indeterminate")
            prog.pack()
            prog.start()
            
            for file in os.listdir(path):
                if file[-4:] in ('.bmp', '.jpg', 'jpeg','.gif', '.png', '.BMP', '.JPG', 'JPGE','.GIF', '.PNG'):
                    f_img = path + "/" + file
                    image = Image.open(f_img)
                    newwidth = int(image.size[0] / 2)
                    newheight = int(image.size[1] / 2)
                    image = image.resize((newwidth, newheight), PIL.Image.NEAREST)
                    image.save(f_img)
                    sleep(0.5)
            prog.stop()
            top.destroy()
            tkinter.messagebox.showinfo("提示:", "已完成!")
        t = Thread(target=_prog)
        t.start()
    
    def mainloop(self):
        self.root.minsize(330, 190)
        self.root.maxsize(330, 170)
        self.root.title('图片批量处理器')
        self.root.mainloop()


if __name__ == "__main__":
    window = Window()
    window.mainloop()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-17 13:28:02 | 显示全部楼层

可以使用,谢谢您的帮助和指导,太棒啦!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 17:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表