Найти - Пользователи
Полная версия: tkinter идет процесс -окно висит
Начало » GUI » tkinter идет процесс -окно висит
1 2 3
sanodin
При нажатии кнопки программа думает и окно висит пока не выдаст результат,как показать что программа не зависла ,а всего лишь в процессе работы(юзеру)
или индикатор прикрутить?
4kpt
1. Разбить процес, который грузит машину, на несколько этапов.
2. Получить последовательное процентное выполнение процесса. Например, у меня пять этапов. Первый прошел - 20%, второй - 40% и т.п.
3. Повесить механизм отображения процентов выполнения на какой-нибуть виджет (можно на canvas с последовательной закраской, чтобы визуально определить процент).
4. После выполнения каждого этапа вызывать функцию, которая приводит к изменению внешнего вида этого виджета.
5. Не забыть в функции вызвать метод виджет.update(), чтобы изменения вступали в силу сразу после выполнения определенного этапа, а не после прохода всех этапов.
Нужен пример, пишите…
sanodin
Очень нужен пример,не могу закончить программу…так то все готово ,но это зависание…
4kpt
Ждите минут 10… Сейчас напедалирую…
sanodin
4kpt
Ждите минут 10… Сейчас напедалирую…
Ваш принцип я понял,только я пытался делать по другому,не как Вы
пытался вызвать при нажатии на кнопку другое модальное немодальное окно с надписью
я так понял процесс один разбить на несколько одновременных процессов?
4kpt
Вот просто с цифрами процента. Числа нужно подставлять исходя из алгоритма, который я привел Вам выше.
# -*- 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
sanodin
я так понял процесс один разбить на несколько одновременных процессов?
Неверно. Необходимо процесс разбить на этапы. В моем примере этапами являются вызовы функции time.sleep(0.5), а действие всего процесса - это работа всего цикла. Я просто в цикл вклиниваю вызов функции update_lab_digit(lab_digit, i). Это позволяет мне избежать “зависания экрана” с точки зрения пользователя.
sanodin
4kpt
понял , иду крутить пример
спасибо
кстати, xrange в третьей ветке нет что ли?
я просто пока установил третий пайтон ,чтоб не мучаться с кодировками
ладно range пойдет
4kpt
Не за что. По результатам отпишитесь. Получилось или нет…
4kpt
Тройку не использую. Даже не знаю, что там есть, а чего нет :)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB