Найти - Пользователи
Полная версия: Не отлавливается нажатие клавиши при запущенном втором потоке. Tkinter\threading.
Начало » Python для экспертов » Не отлавливается нажатие клавиши при запущенном втором потоке. Tkinter\threading.
1 2 3
4kpt
Если висеть долго, то можно сделать рекурсию в рекурсии. Одна будет выполнять метод 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()
sp3
Глубоко не копал, но вряд ли там рекурсия.
4kpt
Знать бы, что значит
self.tk.call()
Можно было бы быть уверенным.
buddha
sp3
Глубоко не копал, но вряд ли там рекурсия.


def call_passive(event):
    print u"Выполнен шаг процесса."
    # Будет запускаться 10 секунд через каждую секунду
    if time.time() - tm < 10:
        root.after(1000, call_passive, event)
Это не рекурсивный вызов?
sp3
Нет.
В тк работает примерно так:
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()

buddha
Приделал в свой сценарий вызов метода after(). Выставил ему 1 милисекунду, чтобы посмотреть как поведёт себя после максимально допустимого кол-ва рекурский. Эту границу сценарий пересёк нормально, и работал так же и дальше. Видимо это не рекурсия…

Пока полёт нормальный. Спасибо за помощь!
4kpt
sp3
Выглядит логично, но откуда такая информация?
sp3
4kpt
Знать бы, что значит
self.tk.call()
_tkinter.c
  {"call",                   Tkapp_Call, METH_VARARGS},
...
static PyObject *
Tkapp_Call(PyObject *selfptr, PyObject *args)
{
...

4kpt
откуда такая информация?
Исходники tcl не смотрел, но как сделать подобное другим способом? Рекурсию и потоки не разумно здесь использовать.
buddha
sp3
Исходники tcl не смотрел, но как сделать подобное другим способом? Рекурсию и потоки не разумно здесь использовать.

Здесь, это где? почему?
gansior
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