【问题标题】:wxpython do action before closing wx.EVT_CLOSEwxpython 在关闭 wx.EVT_CLOSE 之前执行操作
【发布时间】:2021-08-19 07:07:57
【问题描述】:

我有一个框架,其中包含一个网格,其中的行填充了来自我的 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 时如何保存数据 我的意思是我知道如何保存数据,但是当用户关闭框架时我想要它 另一个问题如何在打开框架时使网格扩展? 当它打开时,我必须调整框架的大小以便网格展开

【问题讨论】:

    标签: python-3.x wxpython wxgrid


    【解决方案1】:
    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, 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 不感兴趣,因为它几乎肯定发生了变化,因此我们查询网格,以了解要检查多少行。
    最后,我们可以访问网格中的数据并将其保存,或者在本例中将其打印出来。

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

    保存的结果:

    web1 user1 password1
    Stackoverflow.com Rodrigo xXx
    web3 user3 password3
    

    【讨论】:

    • ohhhh 我做得不好,在你的帮助下修复了它,非常感谢!
    猜你喜欢
    • 2014-12-05
    • 1970-01-01
    • 1970-01-01
    • 2022-10-04
    • 2014-08-27
    • 2016-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多