关机事件下变量作用域的问题

关机事件下变量作用域的问题

看下面这一段代码,是我程序的一个保存信息函数。

         
    def RecordOpen(self):
        iTipOpens=[]
        for iTipShow in self.GetChildren():
            if type(iTipShow)==iTipFrame and iTipShow.id!=-1 and iTipShow.IsShown():
                iTipOpens.append(str(iTipShow.id))
        iTipOpenList='|'.join(iTipOpens)
        self.cfg.Write('openlist',iTipOpenList)



这个函数在我正常关闭应用程序的时候调用很正常。但是如果我绑定以下事件触发,怪异的事情就发生了:
self.Bind(wx.EVT_QUERY_END_SESSION, self.OniTipExit)

其中 self.OniTipExit函数将会执行上面的RecordOpen函数。我发现,在关机事件触发状态下,函数始终不能正确记录数据。

经过跟踪测试,发现以下诡异问题:
    def RecordOpen(self):
        iTipOpens=[]
        for iTipShow in self.GetChildren():
            if type(iTipShow)==iTipFrame and iTipShow.id!=-1 and iTipShow.IsShown():
                iTipOpens.append(str(iTipShow.id))
                # iTipOpens数据记录正常

        # 但是出了for循环,此时的iTipOpens竟然为空了!!!
        iTipOpenList='|'.join(iTipOpens)
        self.cfg.Write('openlist',iTipOpenList)



我不是很清楚关机状态下有关内存变量的清理问题,为什么单单就在wx.EVT_QUERY_END_SESSION触发函数执行的时候会出现这样的问题,其余情况下均正常。有大虾帮忙解释不?

实在没有办法我将代码做了如下更改:
    def RecordOpen(self):
        iTipOpens=[]
        for iTipShow in self.GetChildren():
            if type(iTipShow)==iTipFrame and iTipShow.id!=-1 and iTipShow.IsShown():
                iTipOpens.append(str(iTipShow.id))
                # 将保存语句放入for循环体内,虽然操作冗余了,但能正确保存了...
                iTipOpenList='|'.join(iTipOpens)
                self.cfg.Write('openlist',iTipOpenList)
这个操作也没有冗余吧,不是在if里面么?又不是每次循环都会执行。我认为后面的代码更有条理性


QUOTE:
原帖由 A.com 于 2008-12-11 18:40 发表
这个操作也没有冗余吧,不是在if里面么?又不是每次循环都会执行。我认为后面的代码更有条理性

会多次执行self.cfg.write写入注册表....之前的代码是一次写入

关键我实在不明白怎么变量值会丢失的...
for iTipShow in self.GetChildren():
            if type(iTipShow)==iTipFrame and iTipShow.id!=-1 and iTipShow.IsShown():
                iTipOpens.append(str(iTipShow.id))
                # 将保存语句放入for循环体内,虽然操作冗余了,但能正确保存了...
                iTipOpenList='|'.join(iTipOpens)
                self.cfg.Write('openlist',iTipOpenList
这样写出了for循环 iTipOpenList还是空么?



QUOTE:
原帖由 luffy.deng 于 2008-12-13 10:16 发表
for iTipShow in self.GetChildren():
            if type(iTipShow)==iTipFrame and iTipShow.id!=-1 and iTipShow.IsShown():
                iTipOpens.append(str(iTipShow.id))
                # 将 ...

为空 ,只要出了for循环变量就空了~~~~~妖怪啊~~
没用过wxpython,实在搞不懂 修改后的除了多了几次保存操作 理论上跟原来一样


QUOTE:
原帖由 luffy.deng 于 2008-12-14 11:23 发表
没用过wxpython,实在搞不懂 修改后的除了多了几次保存操作 理论上跟原来一样

问题就妖怪在这里~~~~~~修改之前的代码,其余任何情况下调用一切正常!一旦wx.EVT_QUERY_END_SESSION事件触发调用就歇火~~~~变量值消失~~~

我试想是不是牵扯到windows关机内存清理问题...