Найти - Пользователи
Полная версия: [wxPython]: Создание таймера
Начало » GUI » [wxPython]: Создание таймера
1 2
VasCraft
Доброго времени суток. Заранее извиняюсь, если кому-то вопрос покажется легким до безобразия, но мне как-то непонятно. Суть такова: на фрейме, помимо различных виджетов, имеется объект 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,())
Но даже так не работает. Есть предложения?
Vader
http://wiki.wxpython.org/Timer
VasCraft
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)
…и вот тут вылезают ошибки ввода - вывода. И как это понимать? Как вообще для какого-либо стандартного события добавить действий?
Vader
VasCraft
…и вот тут вылезают ошибки ввода - вывода. И как это понимать?
Какие именно ошибки?
Попробую угадать. У вас on_close не является методом класса, потому и обращаться к переменным класса нельзя, должно же быть так:
def on_close(self, event):
...
VasCraft
Как вообще для какого-либо стандартного события добавить действий?
Эмммм… Что вы имеете ввиду?
VasCraft
Vader
VasCraft
…и вот тут вылезают ошибки ввода - вывода. И как это понимать?
Какие именно ошибки?
Мильоны их )) шутка. Если серьезно, при запуске/закрытии вылезает маленькое окно с заголовком “wxPython: stdout/stderr”, то бишь косяк с выводом.

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

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

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

Под “заработало” подразумевается запуск, циклическое обновление и безглючная остановка таймера при закрытии
VasCraft
Это основной код
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