sanodin
Март 21, 2013 17:39:13
При нажатии кнопки программа думает и окно висит пока не выдаст результат,как показать что программа не зависла ,а всего лишь в процессе работы(юзеру)
или индикатор прикрутить?
4kpt
Март 21, 2013 18:57:29
1. Разбить процес, который грузит машину, на несколько этапов.
2. Получить последовательное процентное выполнение процесса. Например, у меня пять этапов. Первый прошел - 20%, второй - 40% и т.п.
3. Повесить механизм отображения процентов выполнения на какой-нибуть виджет (можно на canvas с последовательной закраской, чтобы визуально определить процент).
4. После выполнения каждого этапа вызывать функцию, которая приводит к изменению внешнего вида этого виджета.
5. Не забыть в функции вызвать метод виджет.update(), чтобы изменения вступали в силу сразу после выполнения определенного этапа, а не после прохода всех этапов.
Нужен пример, пишите…
sanodin
Март 21, 2013 19:04:35
Очень нужен пример,не могу закончить программу…так то все готово ,но это зависание…
4kpt
Март 21, 2013 19:05:28
Ждите минут 10… Сейчас напедалирую…
sanodin
Март 21, 2013 19:10:00
4kpt
Ждите минут 10… Сейчас напедалирую…
Ваш принцип я понял,только я пытался делать по другому,не как Вы
пытался вызвать при нажатии на кнопку другое модальное немодальное окно с надписью
я так понял процесс один разбить на несколько одновременных процессов?
4kpt
Март 21, 2013 19:26:34
Вот просто с цифрами процента. Числа нужно подставлять исходя из алгоритма, который я привел Вам выше.
# -*- 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()
4kpt
Март 21, 2013 19:29:56
sanodin
я так понял процесс один разбить на несколько одновременных процессов?
Неверно. Необходимо процесс разбить на этапы. В моем примере этапами являются вызовы функции
time.sleep(0.5), а действие всего процесса - это работа всего цикла. Я просто в цикл вклиниваю вызов функции
update_lab_digit(lab_digit, i). Это позволяет мне избежать “зависания экрана” с точки зрения пользователя.
sanodin
Март 21, 2013 19:31:07
4kpt
понял , иду крутить пример
спасибо
кстати, xrange в третьей ветке нет что ли?
я просто пока установил третий пайтон ,чтоб не мучаться с кодировками
ладно range пойдет
4kpt
Март 21, 2013 19:32:24
Не за что. По результатам отпишитесь. Получилось или нет…
4kpt
Март 21, 2013 19:38:32
Тройку не использую. Даже не знаю, что там есть, а чего нет :)