Форум сайта python.su
Если висеть долго, то можно сделать рекурсию в рекурсии. Одна будет выполнять метод after() на малом промежутке времени, а другая на очень большом. Не вижу проблем…
По поводу перехвата. Вы, видимо, не запускали мою программу :)
Привожу пример с клавишами
# -*- coding: utf-8 -*- import Tkinter import time tm = time.time() def call_passive(event): print u"Выполнен шаг процесса." # Будет запускаться 10 секунд через каждую секунду if time.time() - tm < 10: root.after(1000, call_passive, event) def call_active(event): print u"Пассивное нажатие в процессе." def keybind(event): print u"Нажата клавиша - ", event.keysym root = Tkinter.Tk() root.geometry("400x400+100+100") root.bind("<Any-KeyRelease>", keybind) bt_free = Tkinter.Button(root, width=20, text="Свободно нажимаем") bt_free.place(relx=0.5, rely=0.33, anchor="center") bt_free.bind("<ButtonRelease-1>", call_active) bt_proc = Tkinter.Button(root, width=20, text=u"Запускаем процесс") bt_proc.place(relx=0.5, rely=0.66, anchor="center") bt_proc.bind("<ButtonRelease-1>", call_passive) root.mainloop()
Офлайн
Глубоко не копал, но вряд ли там рекурсия.
Офлайн
Знать бы, что значит
self.tk.call()
Офлайн
sp3
Глубоко не копал, но вряд ли там рекурсия.
def call_passive(event): print u"Выполнен шаг процесса." # Будет запускаться 10 секунд через каждую секунду if time.time() - tm < 10: root.after(1000, call_passive, event)
Офлайн
Нет.
В тк работает примерно так:
import time class Timer(): def __init__(self): self.ev = [] def after(self, sec, foo,*w,**kw): sec += time.time() self.ev.append( (sec, foo,w,kw,) ) def step(self): for ev in self.ev: sec, foo,w,kw = ev if time.time() >= sec: foo(*w,**kw) self.ev.remove(ev) def mainloop(self): while True: self.step() time.sleep(0.1) t =Timer() def foo1(x): print "foo1",x def foo2(x): print "foo2",x t.after(1, foo1, 1) t.after(2, foo2, 2) t.after(2, foo2, 3) t.after(3, foo1, 4) t.after(0.2, foo1, 5) t.mainloop()
Офлайн
Приделал в свой сценарий вызов метода after(). Выставил ему 1 милисекунду, чтобы посмотреть как поведёт себя после максимально допустимого кол-ва рекурский. Эту границу сценарий пересёк нормально, и работал так же и дальше. Видимо это не рекурсия…
Пока полёт нормальный. Спасибо за помощь!
Офлайн
sp3
Выглядит логично, но откуда такая информация?
Отредактировано 4kpt (Июль 9, 2013 17:58:59)
Офлайн
4kpt_tkinter.c
Знать бы, что значит
self.tk.call()
{"call", Tkapp_Call, METH_VARARGS}, ... static PyObject * Tkapp_Call(PyObject *selfptr, PyObject *args) { ...
4kptИсходники tcl не смотрел, но как сделать подобное другим способом? Рекурсию и потоки не разумно здесь использовать.
откуда такая информация?
Отредактировано sp3 (Июль 10, 2013 01:32:41)
Офлайн
sp3
Исходники tcl не смотрел, но как сделать подобное другим способом? Рекурсию и потоки не разумно здесь использовать.
Офлайн
4kpt - а как остановиь процесс при нажатии кнопки Свободно нажимаем? пробовал ставить выход по условию, это не срабатывает.
Офлайн