Форум сайта python.su
как тут вообще файлы припреплять? ))
Офлайн
Ладно, так напечатаю. В коде кучи коментов, так что не обращаем на них внимания
# -*- coding: utf-8 -*-
import wx
import thread, time
##rb = 0
##rb1 = 0
##rb2 = 0
##delta = 0
##res = 0
class Tester(wx.Frame):
def __init__(self, parent, id):
wx.Frame.__init__(self, parent, id, title='Tester', size=(600,450))
self.f = open('file', 'r')
self.stroka_0 = self.f.readline()[:-1]
self.stroka_1 = self.f.readline()[:-1]
self.stroka_2 = self.f.readline()[:-1]
self.stroka_pr = self.f.readline()[:-1]
self.stroka_buf = ''
self.delta = 0
self.res = 0
panel = wx.Panel(self, -1)
self.timelb = wx.StaticText(panel, -1, pos =(300, 200), label = '10')
self.rb0 = wx.RadioButton(panel, -1, pos=(100,100), label = self.stroka_0, style = wx.RB_GROUP)
self.rb1 = wx.RadioButton(panel, -1, pos=(100,150), label = self.stroka_1)
self.rb2 = wx.RadioButton(panel, -1, pos=(100,200), label = self.stroka_2)
self.timer = wx.Timer(self)
## self.Bind(wx.EVT_RADIOBUTTON, self.OnrbClick, self.rb0)
## self.Bind(wx.EVT_RADIOBUTTON, self.OnrbClick, self.rb1)
## self.Bind(wx.EVT_RADIOBUTTON, self.OnrbClick, self.rb2)
## self.lb0 = wx.StaticText(panel, -1, pos=(80,100))
## self.lb1 = wx.StaticText(panel, -1, pos=(80,150))
## self.lb2 = wx.StaticText(panel, -1, pos=(80,200))
self.btn = wx.Button(panel, -1, label=u'Далее',
pos=(100, 350), size=(125,-1))
self.btn1 = wx.Button(panel, -1, label=u'dfdfdf',
pos=(400, 350), size=(125,-1))
self.Bind(wx.EVT_BUTTON, self.OnClick, self.btn)
self.Bind(wx.EVT_BUTTON, self.OnClick1, self.btn1)
## wx.EVT_CLOSE(self, self.on_close)
self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
## self.Bind(wx.EVT_ACTIVATE, self.OnClick1)
self.Bind(wx.EVT_TIMER, self.OnTimer, self.timer)
self.Show()
## def on_close(event):
## self.timer.Stop()
## self.Destroy()
## def timerstart(self):
## i = 20
## while i >= 0:
## self.timelb.SetLabel(unicode(i))
#### print i
## i -= 1
## time.sleep(1)
## thread.start_new_thread(self.timerstart,())
def OnClick1(self, event):
self.time = int(self.timelb.GetLabel())
## self.time = 10
self.countdown = self.time - 1
self.timelb.SetLabel(str(self.time))
self.timer.Start(1000)
def OnTimer(self, event):
if self.countdown != -1:
#print self.minutesPassed, self.countdown
self.timelb.SetLabel(str(self.countdown))
self.countdown -= 1
else:
self.timer.Stop()
self.timelb.SetLabel(str(self.time))
self.time = int(self.timelb.GetLabel())
self.countdown = self.time - 1
self.timelb.SetLabel(str(self.time))
self.timer.Start(1000)
def OnClick(self, event):
if self.btn.GetLabel() == u'Тест окончен':
dlg = wx.MessageDialog(self, u'Оценка: ' + unicode(self.res),
u'Тестирование окончено', wx.OK | wx.ICON_WARNING)
dlg.ShowModal()
dlg.Destroy()
## self.timer.Destroy()
self.Destroy()
## self.Parent.Show()
else:
## self.btn.SetLabel(u'Далее')
if str(self.rb0.GetValue()) == 'True':
if self.stroka_0 == self.stroka_pr:
self.res += 1
if str(self.rb1.GetValue()) == 'True':
if self.stroka_1 == self.stroka_pr:
self.res += 1
if str(self.rb2.GetValue()) == 'True':
if self.stroka_2 == self.stroka_pr:
self.res += 1
self.stroka_buf = self.f.readline()
if self.stroka_buf != '':
self.stroka_0 = self.stroka_buf[:-1]
self.rb0.SetLabel(self.stroka_0)
self.rb0.Size = (5*len(self.rb0.GetLabel())+25,-1)
## self.mark_rb = int(st[:1])
## self.lb.SetLabel(str(rb))
self.stroka_1 = self.f.readline()[:-1]
self.rb1.SetLabel(self.stroka_1)
self.rb1.Size = (5*len(self.rb1.GetLabel())+25,-1)
## self.lb1.SetLabel(str(rb1))
self.stroka_2 = self.f.readline()[:-1]
self.rb2.SetLabel(self.stroka_2)
self.rb2.Size = (5*len(self.rb2.GetLabel())+25,-1)
self.stroka_pr = self.f.readline()[:-1]
else:
self.btn.SetLabel(u'Тест окончен')
self.f.close()
def OnCloseWindow(self, event):
self.timer.Stop()
self.f.close()
self.Destroy()
## self.Parent.Show()
if __name__ == '__main__':
app = wx.App()
Tester(None, -1)
app.MainLoop()
1
2
3
1
4
5
6
5
7
8
9
9
10
11
12
10
Офлайн
Из всего того что вы написали и из вашего кода я понял, что вы хотите при закрытии окна вызвать оба метода OnCloseWindow и on_close. При этом вы закрываете окно не кликом на крестик, а по окончанию теста. Если так, то:
1. У вас не вызывается ни один из этих методов, посколько по окончанию теста события wx.EVT_CLOSE не происходит, т.к. вы делаете self.Destroy, а не self.Close()
2. Для того, чтобы ваш on_close был методом класса, он должен выглядеть так:
def on_close(self,event):
self.timer.Stop()
self.Destroy()
event.Skip()
self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
self.Bind(wx.EVT_CLOSE, self.on_close)
Отредактировано (Май 4, 2011 00:53:18)
Офлайн