TransWikia.com

stop automatico en Progressbar en tkinter, python

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()

2 Answers

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

ProgressBar funcionando

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

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP