wxpython 在关闭前执行操作 wx.EVT_CLOSE

wxpython do action before closing 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, 0, 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, 1, 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, myGrid,user_data):
        for i in range(0,(len(user_data))):
            print(myGrid.GetCellValue(i,0)+" "+myGrid.GetCellValue(i,1)+" "+myGrid.GetCellValue(i,2))

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


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

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

如果我们将其与您的代码的模拟和修改版本放在一起,我们会得到:

import wx
import wx.grid as gridlib


class MainFrame(wx.Frame): 
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, 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, 0, 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, 1, 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 接受了一个事件,这里的重点是在这种情况下,您知道事件来自哪里,并且它是一个关闭事件。

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

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

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

保存结果:

web1 user1 password1
whosebug.com Rodrigo xXx
web3 user3 password3