各位,这是我的代码。
我希望能够根据用户点击是、否、以及取消(或点击X关闭)进行三种不同的处理,但实际使用时如果点击的不是if中第一行的按钮,弹窗则会刷新一次,我该如何修改以使不论点击哪个按钮都能判断并且只需要点击一次
c = wx.MessageDialog(None, '检测到本期已有数据,是否清除', but, style=wx.YES_NO|wx.CANCEL)
if c.ShowModal() == wx.ID_YES:pass
elif c.ShowModal() == wx.ID_NO:
c.Destroy()
de=False
else :
c.Destroy()
wx.MessageBox('终止')
conn.close()
return
根据你提供的代码,问题可能出在你对弹窗返回值的处理上。在这里,你通过两次调用ShowModal()方法来获取用户点击的按钮返回值,但实际上每次调用ShowModal()都会弹出一个新的对话框,并且返回的值可能不同。
为了解决这个问题,你可以将返回值保存到一个变量中,然后在后续的判断中使用该变量。以下是修改后的代码示例:
c = wx.MessageDialog(None, '检测到本期已有数据,是否清除', but, style=wx.YES_NO|wx.CANCEL)
result = c.ShowModal()
if result == wx.ID_YES:
pass
elif result == wx.ID_NO:
c.Destroy()
de = False
else:
c.Destroy()
wx.MessageBox('终止')
conn.close()
return
通过将返回值保存到变量result中,你可以在后续的判断中使用该变量来避免多次调用ShowModal()方法。希望这能帮助到你解决问题!如果还有其他疑问,请随时提问。
不知道你这个问题是否已经解决, 如果还没有解决的话:解决方案:
问题的根本原因是每次调用c.ShowModal()
都会弹出一个新的对话框,而不是复用上一次的对话框。为了解决这个问题,我们可以使用一个变量来保存弹窗对象,并在按钮点击后进行判断。
以下是优化后的代码:
import wx
app = wx.App()
frame = wx.Frame(None, -1, 'My Frame', size=(400, 300))
def on_dialog_button(event):
dialog = event.GetEventObject()
dialog.Destroy()
if dialog.GetReturnCode() == wx.ID_YES:
# 点击了"Yes"按钮
pass
elif dialog.GetReturnCode() == wx.ID_NO:
de = False
# 点击了"No"按钮
else:
wx.MessageBox('终止')
conn.close()
return
def show_dialog():
dialog = wx.MessageDialog(frame, '检测到本期已有数据,是否清除', '标题', style=wx.YES_NO | wx.CANCEL)
dialog.Bind(wx.EVT_BUTTON, on_dialog_button)
dialog.ShowModal()
show_dialog()
app.MainLoop()
优化后的代码使用了Bind
方法将按钮点击事件与回调函数on_dialog_button
绑定。在回调函数中,我们可以通过GetEventObject()
方法获取到被点击的按钮所属的对话框对象,然后根据按钮的ReturnCode判断用户点击了哪个按钮。
注意:上述代码只是一个优化示例,需要根据实际情况进行修改和调整。