Форум сайта python.su
При нажатии кнопки программа думает и окно висит пока не выдаст результат,как показать что программа не зависла ,а всего лишь в процессе работы(юзеру)
или индикатор прикрутить?
Офлайн
1. Разбить процес, который грузит машину, на несколько этапов.
2. Получить последовательное процентное выполнение процесса. Например, у меня пять этапов. Первый прошел - 20%, второй - 40% и т.п.
3. Повесить механизм отображения процентов выполнения на какой-нибуть виджет (можно на canvas с последовательной закраской, чтобы визуально определить процент).
4. После выполнения каждого этапа вызывать функцию, которая приводит к изменению внешнего вида этого виджета.
5. Не забыть в функции вызвать метод виджет.update(), чтобы изменения вступали в силу сразу после выполнения определенного этапа, а не после прохода всех этапов.
Нужен пример, пишите…
Отредактировано 4kpt (Март 21, 2013 18:58:35)
Офлайн
Очень нужен пример,не могу закончить программу…так то все готово ,но это зависание…
Офлайн
Ждите минут 10… Сейчас напедалирую…
Отредактировано 4kpt (Март 21, 2013 19:05:45)
Офлайн
4kptВаш принцип я понял,только я пытался делать по другому,не как Вы
Ждите минут 10… Сейчас напедалирую…
Отредактировано sanodin (Март 21, 2013 19:21:18)
Офлайн
Вот просто с цифрами процента. Числа нужно подставлять исходя из алгоритма, который я привел Вам выше.
# -*- coding: utf-8 -*- import Tkinter import time root = Tkinter.Tk() root.geometry("200x200+100+100") def update_lab_digit(lab_digit, pos): lab_digit["text"] = "{0}%".format(20*pos) def start_work(event=None): but["relief"] = "raised" fr_in = Tkinter.Frame(root) fr_in.place(relx=0.5, rely=0.3, anchor="center") lab_text = Tkinter.Label(fr_in, text="Process is execute: ") lab_text.pack(side="left") lab_digit = Tkinter.Label(fr_in, text="0%") lab_digit.pack(side="left") for i in xrange(1, 6): root.update() time.sleep(0.5) update_lab_digit(lab_digit, i) but = Tkinter.Button(root, text="Press") but.bind("<ButtonRelease-1>", start_work) but.place(relx=0.5, rely=0.7, anchor="center") root.mainloop()
Офлайн
sanodinНеверно. Необходимо процесс разбить на этапы. В моем примере этапами являются вызовы функции time.sleep(0.5), а действие всего процесса - это работа всего цикла. Я просто в цикл вклиниваю вызов функции update_lab_digit(lab_digit, i). Это позволяет мне избежать “зависания экрана” с точки зрения пользователя.
я так понял процесс один разбить на несколько одновременных процессов?
Отредактировано 4kpt (Март 21, 2013 19:31:20)
Офлайн
4kptпонял , иду крутить пример
Отредактировано sanodin (Март 21, 2013 19:36:35)
Офлайн
Не за что. По результатам отпишитесь. Получилось или нет…
Офлайн
Тройку не использую. Даже не знаю, что там есть, а чего нет :)
Офлайн