xhlbudd 发表于 2021-12-7 21:57:57

利用tkinter设计进度条以及任务完成弹窗

各位老师,大家晚上好!我写了一个小脚本用来批量把图片的像素尺寸缩小到原来的一半,利用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 / 2)
                newheight = int(image.size / 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()

z5560636 发表于 2021-12-8 09:33:52

我觉得最好的办法,就是
for file in os.listdir(path):在这边改成枚举enumerate
然后在循环里面动态的比较百分比。 并且更新一个进度条的控件。

xhlbudd 发表于 2021-12-8 10:06:59

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

谢谢您的解答,因为我对Python语法还不太熟悉,可否帮我的代码修改一下呢(我想把进度条放在“开始执行”按钮的下面)?非常感谢!

xhlbudd 发表于 2021-12-8 21:16:14

自己顶一下,希望有经验的老师帮忙加入一个进度条,谢谢!

qq1151985918 发表于 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 / 2)
                  newheight = int(image.size / 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()

xhlbudd 发表于 2021-12-17 13:28:02

qq1151985918 发表于 2021-12-14 18:20


可以使用,谢谢您的帮助和指导,太棒啦!
页: [1]
查看完整版本: 利用tkinter设计进度条以及任务完成弹窗