微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

wxpython 在关闭 wx.EVT_CLOSE 之前做动作

如何解决wxpython 在关闭 wx.EVT_CLOSE 之前做动作

我有一个框架,其中包含一个网格,其中的行填充了来自我的 api 的数据,因此用户可以编辑网格中的数据,我希望在用户关闭时保存它,单击 X 关闭框架,因此我我这样做

title = "Datos"

    def __init__(self,title,parent=None):
        wx.Frame.__init__(self,parent=parent,title=title)
        user=self.get_ser()
        self.Show()
        panel=wx.Panel(self,-1)
        myGrid = gridlib.Grid(panel)
        user_data = json.loads(self.decrypt(self.get_data(user)))
        print(user_data)
        myGrid.CreateGrid(len(user_data),3)
        
        myGrid.SetColLabelValue(0,"WEB")
        myGrid.SetColLabelValue(1,"USERNAME")
        myGrid.SetColLabelValue(2,"PASSWORD")
        for i in range(0,len(user_data)):
            myGrid.SetCellValue(i,user_data[i]["web"])
            myGrid.SetCellValue(i,1,user_data[i]["username"])
            myGrid.SetCellValue(i,2,user_data[i]["password"])
        
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(myGrid,wx.EXPAND)
        panel.SetSizer(sizer)
        self.SetBackgroundColour(wx.Colour(100,100,100))
        self.Centre()
        self.Show()
        self.Bind(wx.EVT_CLOSE,self.OnClose(myGrid,user_data))
    def OnClose(self,myGrid,user_data):
        dlg = wx.MessageDialog(self,"Do you really want to close this application?","Confirm Exit",wx.OK|wx.CANCEL|wx.ICON_QUESTION)
        result = dlg.ShowModal()
        dlg.Destroy()
        if result == wx.ID_OK:
            self.savedata(myGrid,user_data)
            self.Destroy()
    def savedata(self,user_data):
        for i in range(0,(len(user_data))):
            print(myGrid.GetCellValue(i,0)+" "+myGrid.GetCellValue(i,1)+" "+myGrid.GetCellValue(i,2))

我的问题是打开框架时会出现弹出对话框,我将 myGrid 传递给可以在用户关闭框架时读取每一行的内容,这样我就可以保存当前正在打印数据的数据控制台进行测试

pop up dialog


现在我的问题是当用户单击 X 时如何保存数据 我的意思是我知道如何保存数据,但我想要在用户关闭框架时保存数据 另一个问题如何在打开框架时使网格扩展? 当它打开时,我必须调整框架的大小,以便网格扩展

opened frame

解决方法

  1. 您的代码开头有一个错误的 self.Show
  2. EVENT_CLOSE 发送一个 event,因此您不能只向被调用子程序的参数添加内容(不使用 lambda
  3. 如果您使 myGrid 成为类实例的成员,即通过声明它 self.myGrid,它可用于查询和更改。通过将其声明为 myGrid,它只是一个 local 变量。

如果我们把它们放在一起,加上一个模拟和修改过的代码版本,我们会得到这个:

import wx
import wx.grid as gridlib


class MainFrame(wx.Frame): 
    def __init__(self,parent,title):
        wx.Frame.__init__(self,title=title)
        #user=self.get_ser()
        panel=wx.Panel(self,-1)
        self.myGrid = gridlib.Grid(panel)
        #user_data = json.loads(self.decrypt(self.get_data(user)))
        user_data = [["web1","user1","password1"],["web1","user2","password2"],["web3","user3","password3"]]
        print(user_data)
        self.myGrid.CreateGrid(len(user_data),3)
        
        self.myGrid.SetColLabelValue(0,"WEB")
        self.myGrid.SetColLabelValue(1,"USERNAME")
        self.myGrid.SetColLabelValue(2,"PASSWORD")
        for i in range(0,len(user_data)):
            self.myGrid.SetCellValue(i,user_data[i][0])
            self.myGrid.SetCellValue(i,1,user_data[i][1])
            self.myGrid.SetCellValue(i,2,user_data[i][2])
        
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.myGrid,wx.EXPAND)
        panel.SetSizer(sizer)
        self.Bind(wx.EVT_CLOSE,self.OnClose)
        self.SetBackgroundColour(wx.Colour(100,100,100))
        self.Centre()
        self.Show()

    def OnClose(self,event):
        dlg = wx.MessageDialog(self,"Do you really want to close this application?","Confirm Exit",wx.OK|wx.CANCEL|wx.ICON_QUESTION)
        result = dlg.ShowModal()
        dlg.Destroy()
        if result == wx.ID_OK:
            self.savedata()
            self.Destroy()

    def savedata(self):
        gr = self.myGrid.GetNumberRows()
        for i in range(0,(gr)):
            print(self.myGrid.GetCellValue(i,0)+" "+self.myGrid.GetCellValue(i,1)+" "+self.myGrid.GetCellValue(i,2))

app = wx.App()
MainFrame(None,"Data")
app.MainLoop()

正如您所见,OnClose 接受一个事件,这里的重点是在这种情况下,您知道该事件的来源以及它是一个 Close 事件。

savedata 例程,同样在本例中,不需要知道要保存什么,只有 myGrid。但是,如果有任何疑问,我们可以发送 event object,或者为不同的对象调用不同的保存例程。

我们对传递给网格的原始 userdata 不感兴趣,因为它几乎肯定已经改变了,所以我们查询网格,以了解要检查多少行。
最后,我们可以访问网格中的数据并保存它,或者在这种情况下将其打印出来。

注意您可能需要考虑放弃编辑并退出的选项。就目前而言,它是保存,否则您将永远编辑数据。

enter image description here

保存结果:

web1 user1 password1
Stackoverflow.com Rodrigo xXx
web3 user3 password3

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。