0

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

打开的框架

4

1 回答 1

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,接受一个事件,这里的重点是,在这种情况下,您知道事件来自哪里并且它是一个 Close 事件。

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

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

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

在此处输入图像描述

保存结果:

web1 user1 password1
Stackoverflow.com Rodrigo xXx
web3 user3 password3
于 2021-06-01T07:55:23.627 回答