如何解决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 传递给可以在用户关闭框架时读取每一行的内容,这样我就可以保存当前正在打印数据的数据控制台进行测试
现在我的问题是当用户单击 X 时如何保存数据 我的意思是我知道如何保存数据,但我想要在用户关闭框架时保存数据 另一个问题如何在打开框架时使网格扩展? 当它打开时,我必须调整框架的大小,以便网格扩展
解决方法
- 您的代码开头有一个错误的
self.Show
。 -
EVENT_CLOSE
发送一个event
,因此您不能只向被调用子程序的参数添加内容(不使用lambda
) - 如果您使
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
不感兴趣,因为它几乎肯定已经改变了,所以我们查询网格,以了解要检查多少行。
最后,我们可以访问网格中的数据并保存它,或者在这种情况下将其打印出来。
注意您可能需要考虑放弃编辑并退出的选项。就目前而言,它是保存,否则您将永远编辑数据。
保存结果:
web1 user1 password1
Stackoverflow.com Rodrigo xXx
web3 user3 password3
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。