Уведомления

Группа в Telegram: @pythonsu

#1 Май 3, 2011 19:46:14

VasCraft
От:
Зарегистрирован: 2010-08-23
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

[wxPython]: Создание таймера

Доброго времени суток. Заранее извиняюсь, если кому-то вопрос покажется легким до безобразия, но мне как-то непонятно. Суть такова: на фрейме, помимо различных виджетов, имеется объект timelb класса StaticText. Необходимо, чтобы в его лейбеле отображалось не системное время (примеров этого в сети завались), а значение таймера, обыкновенного уменьшающегося во времени значения таймера.

Функция самого таймера написана:

def timerstart():
i = 20
while i <= 0:
Tester.timelb.SetLabel(unicode(i))
i -= 1
time.sleep(1)
где Tester - целевой фрейм, i = значение, загоняемое в timelb. Вроде бы задача тривиальна, но я не могу понять, КАК привязать эту функцию к фрейму?

есть вариант - создание независимого потока:

thread.start_new_thread(timerstart,())
Но даже так не работает. Есть предложения?



Офлайн

#2 Май 3, 2011 20:49:43

Vader
От:
Зарегистрирован: 2010-01-30
Сообщения: 152
Репутация: +  0  -
Профиль   Отправить e-mail  

[wxPython]: Создание таймера

Офлайн

#3 Май 3, 2011 22:26:59

VasCraft
От:
Зарегистрирован: 2010-08-23
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

[wxPython]: Создание таймера

Vader
http://wiki.wxpython.org/Timer
Упс, я как раз интересный код откопал относительно wxTimer, как раз ссылочка пригодилась. Однако на вики описывается случай с экстренным закрытием фрейма и остановкой его таймера, что как раз я и обрабатываю. Непонятно одно: как данную конструкцию

def on_close(event):
timer.Stop()
frame.Destroy()

wx.EVT_CLOSE(frame, on_close)
использовать, так как я создавал отдельный экземпляр класса wx.Frame - Tester, объект timer используется в нескольких функция, поэтому self.timer, еще отдельная функция для закрытия приложения

    def OnCloseWindow(self, event):
self.timer.Stop()
self.f.close()
self.Destroy()
которую тоже надо урезать и превращать в вид

    def OnCloseWindow(self, event):
self.f.close()
on_close()
и тогда самый первый код приводится к виду:

def on_close(event):
self.timer.Stop()
self.Destroy()

wx.EVT_CLOSE(Tester, on_close)
…и вот тут вылезают ошибки ввода - вывода. И как это понимать? Как вообще для какого-либо стандартного события добавить действий?



Отредактировано (Май 3, 2011 22:29:03)

Офлайн

#4 Май 3, 2011 22:47:41

Vader
От:
Зарегистрирован: 2010-01-30
Сообщения: 152
Репутация: +  0  -
Профиль   Отправить e-mail  

[wxPython]: Создание таймера

VasCraft
…и вот тут вылезают ошибки ввода - вывода. И как это понимать?
Какие именно ошибки?
Попробую угадать. У вас on_close не является методом класса, потому и обращаться к переменным класса нельзя, должно же быть так:
def on_close(self, event):
...
VasCraft
Как вообще для какого-либо стандартного события добавить действий?
Эмммм… Что вы имеете ввиду?



Отредактировано (Май 3, 2011 22:49:21)

Офлайн

#5 Май 3, 2011 23:09:28

VasCraft
От:
Зарегистрирован: 2010-08-23
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

[wxPython]: Создание таймера

Vader
VasCraft
…и вот тут вылезают ошибки ввода - вывода. И как это понимать?
Какие именно ошибки?
Мильоны их )) шутка. Если серьезно, при запуске/закрытии вылезает маленькое окно с заголовком “wxPython: stdout/stderr”, то бишь косяк с выводом.

Vader
Попробую угадать. У вас on_close не является методом класса, потому и обращаться к переменным класса нельзя, должно же быть так:
def on_close(self, event):
...
Да, вы правы. И что делать?

Vader
VasCraft
Как вообще для какого-либо стандартного события добавить действий?
Эмммм… Что вы имеете ввиду?
Хорошо, объясню. Допустим, у нас имеется стандартное событие wx.EVT_CLOSE. Оно конкретно отвечает за закрытие приложения. Суть проблемы состоит в том, как в это стандартное событие прилепить еще пару-тройку функций, например, остановить тот же самый таймер, ибо внутри конструкции OnCloseWindow он нифига не останавливается, и вызывает описанную мной ситуацию.



Офлайн

#6 Май 3, 2011 23:25:37

Vader
От:
Зарегистрирован: 2010-01-30
Сообщения: 152
Репутация: +  0  -
Профиль   Отправить e-mail  

[wxPython]: Создание таймера

VasCraft
при запуске/закрытии вылезает маленькое окно с заголовком “wxPython: stdout/stderr”, то бишь косяк с выводом
Скорее всего, в этом окне то самое исключение из-за которого все поламалось.
VasCraft
Да, вы правы. И что делать?
Сделать его методом класса.
Ваш КО.
VasCraft
Хорошо, объясню. Допустим, у нас имеется стандартное событие wx.EVT_CLOSE. Оно конкретно отвечает за закрытие приложения. Суть проблемы состоит в том, как в это стандартное событие прилепить еще пару-тройку функций, например, остановить тот же самый таймер, ибо внутри конструкции OnCloseWindow он нифига не останавливается, и вызывает описанную мной ситуацию.
Если я правильно понял, то вы хотите, чтобы по одному событию вызывалось несколько методов, которые при этом могут находиться в разных классах. Так?
Если так, то либо просто вызывайте нужный вам метод из метода, который уже обрабатывает событие, либо используйте event.Skip() в конце каждого обработчика, тогда это событие будет доступно всем остальным.



Отредактировано (Май 3, 2011 23:26:30)

Офлайн

#7 Май 3, 2011 23:47:09

VasCraft
От:
Зарегистрирован: 2010-08-23
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

[wxPython]: Создание таймера

Vader
VasCraft
Да, вы правы. И что делать?
Сделать его методом класса.
Ваш КО.
Легко сказать, собсно, я этим и занимался ))

Вот такую фигню я уже делал:

def on_close(event):
self.timer.Stop()
self.Destroy()
## хотя строка ниже - это лишнее
wx.EVT_CLOSE(self, self.on_close)
self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
Но, святые литовцы, оно не работает!!



Офлайн

#8 Май 3, 2011 23:49:50

Vader
От:
Зарегистрирован: 2010-01-30
Сообщения: 152
Репутация: +  0  -
Профиль   Отправить e-mail  

[wxPython]: Создание таймера

VasCraft
Но, святые литовцы, оно не работает!!
И не должно, и святые литовцы в этом не помогут :)

Вобщем, или читайте внимательно доки или выкладывайте код, попробуем разобраться.



Офлайн

#9 Май 3, 2011 23:51:31

VasCraft
От:
Зарегистрирован: 2010-08-23
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

[wxPython]: Создание таймера

Вообще же решил связать запуск таймера не с активацией фрейма, а с событием кнопки. И ведь заработало же! Может, косяк в активации фрейма?

Под “заработало” подразумевается запуск, циклическое обновление и безглючная остановка таймера при закрытии



Отредактировано (Май 3, 2011 23:52:47)

Офлайн

#10 Май 3, 2011 23:57:16

VasCraft
От:
Зарегистрирован: 2010-08-23
Сообщения: 29
Репутация: +  0  -
Профиль   Отправить e-mail  

[wxPython]: Создание таймера

Это основной код



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version