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 时我该如何保存数据
我的意思是我知道如何保存数据但是当用户关闭框架时我想要它
另一个问题打开框架时如何使网格展开?
当它打开时,我必须调整框架的大小,以便网格扩展
- 您的代码开头有一个错误
self.Show
。
EVENT_CLOSE
发送了一个 event
,所以你不能只向被调用子程序的参数添加东西(不使用 lambda
)
- 如果您使
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
我有一个框架,其中包含一个网格,其中的行填充了来自我的 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 时我该如何保存数据 我的意思是我知道如何保存数据但是当用户关闭框架时我想要它 另一个问题打开框架时如何使网格展开? 当它打开时,我必须调整框架的大小,以便网格扩展
- 您的代码开头有一个错误
self.Show
。 EVENT_CLOSE
发送了一个event
,所以你不能只向被调用子程序的参数添加东西(不使用lambda
)- 如果您使
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