Python PIL 在图片中插入进度条-ProgressBar

博客介绍了使用Python绘图实现进度条的相关参数。包括图片路径imgPath,进度条背景颜色bgcolor、进度条颜色color,以及进度条的横纵坐标位置x、y,宽度w、高度h,还有进度r(范围0 - 1)。
from PIL import Image
from PIL import ImageDraw

def progressBar(imgPath, bgcolor, color, x, y, w, h, progress):   	 
    im = Image.open(imgPath)    
    drawObject = ImageDraw.Draw(im)
    
    '''BG'''    
    drawObject.ellipse((x+w,y,x+h+w,y+h),fill=bgcolor)    
    drawObject.ellipse((x,y,x+h,y+h),fill=bgcolor)    
    drawObject.rectangle((x+(h/2),y, x+w+(h/2), y+h),fill=bgcolor)
    
    '''PROGRESS'''    
    if(progress<=0):        
        progress = 0.01    
    if(progress>1):        
        progress=1    
    w = w*progress    
    drawObject.ellipse((x+w,y,x+h+w,y+h),fill=color)    
    drawObject.ellipse((x,y,x+h,y+h),fill=color)    
    drawObject.rectangle((x+(h/2),y, x+w+(h/2), y+h),fill=color)
    
    '''SAVE'''    
    im.save(imgPath)

imgPath 图片路径
bgcolor 进度条背景
color 进度条颜色
x 横坐标位置
y 纵坐标位置
w width
h height
r 进度(0-1)

要在带有颜色的进度条上实现显示实际插入数据库的进度,以下是不同语言环境下的实现思路及示例代码: #### Python + Tkinter 示例 如果使用 Python 的 Tkinter 来展示进度条,并且结合数据库插入操作,可以按照以下方式修改之前的代码。假设使用 SQLite 数据库进行插入操作: ```python import tkinter as tk from PIL import Image, ImageTk import sqlite3 import time # 模拟数据库插入操作 def insert_data(): global progress conn = sqlite3.connect('example.db') cursor = conn.cursor() # 创建表 cursor.execute('''CREATE TABLE IF NOT EXISTS test_table (id INTEGER PRIMARY KEY AUTOINCREMENT, data TEXT)''') total_records = 100 for i in range(total_records): cursor.execute("INSERT INTO test_table (data) VALUES (?)", (f"Data {i}",)) conn.commit() progress = (i + 1) / total_records * 100 update_progress(progress) root.update() time.sleep(0.1) conn.close() # 更新进度 def update_progress(value): # 计算小羊的位置 x = (value / 100) * (progress_width - sheep_width) canvas.coords(sheep, x, 0) # 更新进度条颜色填充 fill_width = (value / 100) * progress_width canvas.coords(progress_fill, 0, 0, fill_width, progress_height) # 更新进度文本 canvas.itemconfig(progress_text, text=f"{int(value)}%") root = tk.Tk() root.title("悬浮上传进度条") # 设置窗口为悬浮窗口 root.wm_attributes("-topmost", True) root.wm_overrideredirect(True) # 进度条的宽度和高度 progress_width = 300 progress_height = 20 # 创建 Canvas canvas = tk.Canvas(root, width=progress_width, height=progress_height + 30) canvas.pack() # 绘制进度条背景 canvas.create_rectangle(0, 0, progress_width, progress_height, fill="lightgray") # 绘制进度条填充部分,设置颜色 progress_fill = canvas.create_rectangle(0, 0, 0, progress_height, fill="green") # 加载小羊图标 sheep_image = Image.open("sheep.png") # 请替换为实际的小羊图片路径 sheep_image = sheep_image.resize((30, 30)) sheep_photo = ImageTk.PhotoImage(sheep_image) sheep_width = sheep_image.width sheep = canvas.create_image(0, 0, anchor=tk.NW, image=sheep_photo) # 初始化进度 progress = 0 # 显示进度文本 progress_text = canvas.create_text(progress_width // 2, progress_height + 20, text="0%") # 开始模拟数据库插入 insert_data() root.mainloop() ``` #### Java 示例 如果是 Java 环境,结合进度条和数据库插入操作,以下是一个简单示例: ```java import javax.swing.*; import java.awt.*; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; public class DatabaseInsertProgress extends JFrame { private JProgressBar progressBar; private JLabel progressLabel; public DatabaseInsertProgress() { setTitle("Database Insert Progress"); setSize(300, 100); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLayout(new FlowLayout()); progressBar = new JProgressBar(0, 100); progressLabel = new JLabel("0%"); add(progressBar); add(progressLabel); // 启动数据库插入线程 new Thread(this::insertData).start(); } private void insertData() { try (Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "password")) { int totalRecords = 100; for (int i = 0; i < totalRecords; i++) { String sql = "INSERT INTO test_table (data) VALUES (?)"; try (PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setString(1, "Data " + i); pstmt.executeUpdate(); } int progress = (i + 1) * 100 / totalRecords; updateProgress(progress); Thread.sleep(100); } } catch (SQLException | InterruptedException e) { e.printStackTrace(); } } private void updateProgress(int progress) { SwingUtilities.invokeLater(() -> { progressBar.setValue(progress); progressLabel.setText(progress + "%"); }); } public static void main(String[] args) { SwingUtilities.invokeLater(() -> { DatabaseInsertProgress frame = new DatabaseInsertProgress(); frame.setVisible(true); }); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值