Stack Overflow en español Asked on December 10, 2020
Buen dia, Tengo un problema con este pequeño codigo. Busco lograr que la barra de progreso se pare al 100% luego de completar un ciclo de for.
hasta el momento solo he logrado que la barra se llene dependiendo de la rapidez que se ponga en start(10)
. al llenarse la barra el vuelve a repetir una y otra vez. Se que puedo hacerle un stop()
con otro boton pero yo busco que al llegar al 100% se pare y al volver a darle al boton vuelva a comenzar de 0 a 100.
por ejemplo:
me contara del 1 al 10, Entonces cada porcentaje seria un 10% y al 100% para hasta presionar de nuevo el boton y comenzar de 0 a 100% de nuevo.
x = 10
for i in range(1,x+1):
print(i)
Esto es lo que he logrado hasta el momento
import tkinter
from tkinter import *
from tkinter.ttk import *
def clicked():
pgbar.start(10)
root = tkinter.Tk()
root.geometry("500x500")
pgbar = Progressbar(
root,
length=200,
orient=HORIZONTAL,
maximum = 100,
value = 0,
mode = 'determinate'
)
pgbar.pack()
btn = Button(
root,
text= 'Click Me',
command = clicked,
)
btn.pack()
root.mainloop()
Quizás esto te funcione:
import tkinter
from tkinter import *
from tkinter.ttk import *
process = 0
def clicked():
global process
if process == pgbar['maximum']:
#Reiniciar
terminado['text'] = ""
process = 0
pgbar['value'] = 0
process += 10
pgbar['value'] = process
terminado['text'] = str(process) + "%"
if pgbar['value'] >= pgbar['maximum']:
terminado['text'] = "100% completado"
return
root.after(100, clicked)
root = tkinter.Tk()
root.geometry("500x500")
pgbar = Progressbar(root, length=200, orient=HORIZONTAL, maximum=100, value=0, mode='determinate')
pgbar.pack()
terminado = Label(root, text="")
terminado.pack()
btn = Button(
root,
text='Click Me',
command=clicked,
)
btn.pack()
root.mainloop()
Correct answer by Firefly on December 10, 2020
Hice una aplicación similar para clase el año pasado, espero que te sirva:
import random
import threading
import time
from tkinter import *
from tkinter import ttk
def force_wait():
var.set(0)
for i in range(247):
time.sleep(random.randrange(1, 15) / 10)
var.set(var.get() + 10)
def increase_bar():
threading.Thread(target=force_wait).start()
root = Tk()
root.rowconfigure(0, weight=1, minsize=20)
root.columnconfigure(0, weight=1)
# Creating the frame for the grid
frame = ttk.Frame(root)
frame.grid(column=0, row=0, sticky="NSWE")
var = IntVar()
var.set(0)
p = ttk.Progressbar(frame, orient=HORIZONTAL, length=200, mode='determinate', variable=var, maximum=247)
p.grid(row=0, column=0)
ttk.Button(text='Turn it on', command=increase_bar).grid(row=1, column=0)
root.geometry("300x200-10-20")
root.mainloop()
Edito: Este es mi ejercicio original, y funcionando correctamente. Está hecho para que la barra se llene a un ritmo aleatorio, pero puedes quitarle eso facilmente y queda igual que el tuyo
Por cierto, si te da el error RuntimeError: main thread is not in main loop
es debido a que estás matando el proceso principal dejando el hilo que gestiona la progressbar en funcionamiento. Primero habría que detener los hilos que acceden a la interfaz para que, al eliminar esta, los hilos no den error en tiempo de ejecución.
Answered by Benito-B on December 10, 2020
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP