LINUX.ORG.RU

[Python][Tkinter] как показать, что приложение думает, а не висит? ;-)

 ,


0

1

Есть форточка, при некоторых действиях вызывается долгоиграющая (десятки секунд) ф-я написанная на С++. Как показать юзеру, что приложение не повисло а чем то занято?

Если поменять курсор (на часики), так это не отрабатывает (не меняется он):

import time
from Tkinter import *

def click() :
    WRoot.config( cursor='clock' )
    time.sleep(1) #call function
    WRoot.config( cursor='' )

WRoot = Tk()
WRoot.geometry( '300x200' )
Button( WRoot, command=click, text='sleep' ).pack()
WRoot.mainloop() 

хотелось бы показывать какой нить ползунок, но во первых как это сделать когда все висит, во вторых не оч понятно как степень выполнения из ф-ии передавать... пока пишу процентики в stdout.

Как это сделать Ъ не изобретая лисапеда?

★★★★★

Делай асинхронно.

Zenom ★★★
()
Ответ на: комментарий от pathfinder

И то верно... помогает.

Но тогда надо как то в Tkinter лочить все элементы окна на время работы ф-ии (кроме ползунка).

Я так понимаю что все изменения там принимаются после того как вернулось управление из фии, те на самом деле лучше поменять курсор, кинуть на after вызов долгоиграющей ф-ии вернуть управление (если ползунок не рисовать).

Ну и вопрос с передачей инфы о степени завершения С++ фии наружу остается открытым... не хочетя городить какие то очереди, пайпы и проч, как бы это сделать попроще и поизящней?

AIv ★★★★★
() автор топика
Ответ на: комментарий от Led

> При чём тут линукс?

Месье работает тока в терминале? У меня и у коллег линуск, и в нем есть форточки.

AIv ★★★★★
() автор топика
Ответ на: комментарий от Led

Сленговое название окна. Маленькое окно;-)

Речь идет о GUI

AIv ★★★★★
() автор топика
Ответ на: комментарий от AIv

> Но тогда надо как то в Tkinter лочить все элементы окна на время работы ф-ии (кроме ползунка).

Повесить поверх маленькое окошко с «ползунком», блокирующее ввод в родительское?

pevzi ★★★★★
()

Python
как показать, что приложение думает, а не висит?

ruby же

elrprt
()
Ответ на: комментарий от AIv

А если так?

#!/usr/bin/env python

from Tkinter import *

class Modal(Toplevel):
    def __init__(self, parent):
        Toplevel.__init__(self, parent)
        self.parent = parent
        self.withdraw()

    def __call__(self):
        self.deiconify()
        self.focus_set()
        self.grab_set()
        self.parent.wait_window(self)

root = Tk()
modal = Modal(root)
Button(root, text='Modal?', command=lambda:modal()).pack()
root.mainloop()
theNamelessOne ★★★★★
()
Ответ на: комментарий от AIv

Ну и, в качестве альтернативы, можно не блокировать главное окно, а просто скрывать его (пока не закроем «модальное» окно):

#!/usr/bin/env python

from Tkinter import *

class Modal(Toplevel):
    def __init__(self, parent):
        Toplevel.__init__(self, parent)
        self.parent = parent
        self.parent.withdraw()
        self.focus_set()
        self.grab_set()

    def destroy(self):
        self.parent.deiconify()
        Toplevel.destroy(self)

        
root = Tk()
Button(root, text='Modal?', command=lambda:Modal(root)).pack()
root.mainloop()
theNamelessOne ★★★★★
()
Ответ на: комментарий от theNamelessOne

Первый вариант как и ожидалось не вполне не модальный - можно переключится на род окно и закрыть его, но правда виджеты на нем действительно залочены.

Над вторым вариантом я и раньше думал, но он не прокатывает по ряду причин.

Попробую пока таки первый вариант. Спасибо!

AIv ★★★★★
() автор топика
Ответ на: комментарий от pathfinder

И епрст, ну писал же... тесты тестами, но С++ функция... GIL мать его ети! Никакие питоновские треды тут не помогут, все висит глухарем пока ф-я работает.

AIv ★★★★★
() автор топика
Ответ на: комментарий от AIv

Я когда писал расчетные проги всегда выносил их в отдельное CLI приложение которое файлами взаимодействовало с основным. Тогда можно читать что приложение пишет в файл и по этой информации например прогрессбар рисовать. Ну и потом это все в MPI было засунуть проще и на кластере запустить.

kernel ★★☆
()
Ответ на: комментарий от kernel

Это визуализирующая прога, к которой я прикрутил экспериментальную долгоиграющую ф-ю, и юзать там два процесса это уж слишком...

Для расчетных приложений ес-но только так и делается;-)

AIv ★★★★★
() автор топика
Ответ на: комментарий от AIv

> Это визуализирующая прога, к которой я прикрутил экспериментальную

долгоиграющую ф-ю, и юзать там два процесса это уж слишком...


Если она долгоиграющая это расчетное приложение и есть. Расчеты для визуализации тоже расчеты.

Для расчетных приложений ес-но только так и делается;-)


Вотвот.

kernel ★★☆
()
Ответ на: комментарий от kernel

> Если она долгоиграющая это расчетное приложение и есть. Расчеты для визуализации тоже расчеты.

20 сек, даже неск минут, с учетом того что интерактивное это по сравнению с расчетами фигня (расчеты идут сутками).

В любом случае, я не готов возякаться в этой задаче с неск процессами. В общем я пошео простым путем - ф-я обертка меняет курсор и вешает на after вызов дрлгоиграющей (или уж какая есть) перерисовки. Долгоиграющая ф-я показывает ползунок в stdout, форточка в это время висит с курсором в виде часиков. Дост наглядно...

Всем спасибо за обсуждение!

AIv ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.