Уведомления

Группа в Telegram: @pythonsu

#1 Июль 8, 2013 09:19:57

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

Не отлавливается нажатие клавиши при запущенном втором потоке. Tkinter\threading.

Если висеть долго, то можно сделать рекурсию в рекурсии. Одна будет выполнять метод 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()



Офлайн

#2 Июль 8, 2013 18:12:25

sp3
От:
Зарегистрирован: 2010-01-12
Сообщения: 405
Репутация: +  18  -
Профиль   Отправить e-mail  

Не отлавливается нажатие клавиши при запущенном втором потоке. Tkinter\threading.

Глубоко не копал, но вряд ли там рекурсия.



Офлайн

#3 Июль 8, 2013 20:44:38

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

Не отлавливается нажатие клавиши при запущенном втором потоке. Tkinter\threading.

Знать бы, что значит

self.tk.call()
Можно было бы быть уверенным.



Офлайн

#4 Июль 9, 2013 11:26:01

buddha
От:
Зарегистрирован: 2012-03-02
Сообщения: 422
Репутация: +  15  -
Профиль   Отправить e-mail  

Не отлавливается нажатие клавиши при запущенном втором потоке. Tkinter\threading.

sp3
Глубоко не копал, но вряд ли там рекурсия.


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

Офлайн

#5 Июль 9, 2013 12:47:19

sp3
От:
Зарегистрирован: 2010-01-12
Сообщения: 405
Репутация: +  18  -
Профиль   Отправить e-mail  

Не отлавливается нажатие клавиши при запущенном втором потоке. Tkinter\threading.

Нет.
В тк работает примерно так:

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()



Офлайн

#6 Июль 9, 2013 15:47:10

buddha
От:
Зарегистрирован: 2012-03-02
Сообщения: 422
Репутация: +  15  -
Профиль   Отправить e-mail  

Не отлавливается нажатие клавиши при запущенном втором потоке. Tkinter\threading.

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

Пока полёт нормальный. Спасибо за помощь!

Офлайн

#7 Июль 9, 2013 17:56:12

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

Не отлавливается нажатие клавиши при запущенном втором потоке. Tkinter\threading.

sp3
Выглядит логично, но откуда такая информация?



Отредактировано 4kpt (Июль 9, 2013 17:58:59)

Офлайн

#8 Июль 10, 2013 01:32:16

sp3
От:
Зарегистрирован: 2010-01-12
Сообщения: 405
Репутация: +  18  -
Профиль   Отправить e-mail  

Не отлавливается нажатие клавиши при запущенном втором потоке. Tkinter\threading.

4kpt
Знать бы, что значит
self.tk.call()
_tkinter.c
  {"call",                   Tkapp_Call, METH_VARARGS},
...
static PyObject *
Tkapp_Call(PyObject *selfptr, PyObject *args)
{
...

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



Отредактировано sp3 (Июль 10, 2013 01:32:41)

Офлайн

#9 Июль 10, 2013 08:48:23

buddha
От:
Зарегистрирован: 2012-03-02
Сообщения: 422
Репутация: +  15  -
Профиль   Отправить e-mail  

Не отлавливается нажатие клавиши при запущенном втором потоке. Tkinter\threading.

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

Здесь, это где? почему?

Офлайн

#10 Июль 13, 2013 11:38:55

gansior
Зарегистрирован: 2013-07-05
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Не отлавливается нажатие клавиши при запущенном втором потоке. Tkinter\threading.

4kpt - а как остановиь процесс при нажатии кнопки Свободно нажимаем? пробовал ставить выход по условию, это не срабатывает.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version