Skip to content

Commit 2b6a83e

Browse files
authored
Add files via upload
1 parent 31b935b commit 2b6a83e

File tree

1 file changed

+112
-0
lines changed

1 file changed

+112
-0
lines changed

live-progress-bar/progress_bar_app.py

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
import tkinter as tk
2+
from tkinter import ttk, messagebox
3+
import threading
4+
import time
5+
6+
7+
class ProgressBarApp:
8+
def __init__(self, root):
9+
self.root = root
10+
self.root.title("Live Progress Bar")
11+
self.root.geometry("420x260")
12+
self.root.resizable(False, False)
13+
14+
self.stop_flag = False
15+
self.thread = None
16+
17+
self.setup_ui()
18+
19+
def setup_ui(self):
20+
tk.Label(self.root, text="Live Progress Bar Generator", font=("Helvetica", 14, "bold")).pack(pady=10)
21+
22+
# Time Inputs
23+
time_frame = tk.Frame(self.root)
24+
time_frame.pack(pady=5)
25+
26+
self.hours_entry = self._create_time_input(time_frame, "Hours")
27+
self.minutes_entry = self._create_time_input(time_frame, "Minutes")
28+
self.seconds_entry = self._create_time_input(time_frame, "Seconds")
29+
30+
# Progress Bar
31+
self.progress = ttk.Progressbar(self.root, length=350, mode='determinate', maximum=100)
32+
self.progress.pack(pady=15)
33+
34+
# Percentage Label
35+
self.percent_label = tk.Label(self.root, text="0.00%", font=("Helvetica", 12))
36+
self.percent_label.pack()
37+
38+
# Buttons
39+
btn_frame = tk.Frame(self.root)
40+
btn_frame.pack(pady=10)
41+
42+
self.start_btn = tk.Button(btn_frame, text="Start", command=self.start_progress)
43+
self.start_btn.grid(row=0, column=0, padx=10)
44+
45+
self.stop_btn = tk.Button(btn_frame, text="Stop", command=self.stop_progress, state=tk.DISABLED)
46+
self.stop_btn.grid(row=0, column=1, padx=10)
47+
48+
def _create_time_input(self, parent, label_text):
49+
frame = tk.Frame(parent)
50+
frame.pack(side=tk.LEFT, padx=10)
51+
tk.Label(frame, text=label_text).pack()
52+
entry = tk.Entry(frame, width=5)
53+
entry.pack()
54+
return entry
55+
56+
def get_total_seconds(self):
57+
try:
58+
h = int(self.hours_entry.get() or 0)
59+
m = int(self.minutes_entry.get() or 0)
60+
s = int(self.seconds_entry.get() or 0)
61+
total = h * 3600 + m * 60 + s
62+
if total <= 0:
63+
raise ValueError
64+
return total
65+
except ValueError:
66+
return None
67+
68+
def start_progress(self):
69+
total_seconds = self.get_total_seconds()
70+
if total_seconds is None:
71+
messagebox.showerror("Invalid Input", "Please enter a valid positive time.")
72+
return
73+
74+
self.stop_flag = False
75+
self.start_btn.config(state=tk.DISABLED)
76+
self.stop_btn.config(state=tk.NORMAL)
77+
self.progress["value"] = 0
78+
self.percent_label.config(text="0.00%")
79+
80+
self.thread = threading.Thread(target=self.run_progress, args=(total_seconds,), daemon=True)
81+
self.thread.start()
82+
83+
def run_progress(self, duration):
84+
start_time = time.time()
85+
end_time = start_time + duration
86+
87+
while not self.stop_flag:
88+
now = time.time()
89+
elapsed = now - start_time
90+
progress = min(elapsed / duration, 1.0) # بین ۰ و ۱
91+
percentage = progress * 100
92+
93+
self.progress["value"] = percentage
94+
self.percent_label.config(text=f"{percentage:.2f}%")
95+
96+
if progress >= 1.0:
97+
break
98+
99+
time.sleep(0.05) # smoother
100+
101+
self.start_btn.config(state=tk.NORMAL)
102+
self.stop_btn.config(state=tk.DISABLED)
103+
104+
def stop_progress(self):
105+
self.stop_flag = True
106+
self.percent_label.config(text="Stopped")
107+
108+
109+
if __name__ == "__main__":
110+
root = tk.Tk()
111+
app = ProgressBarApp(root)
112+
root.mainloop()

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy