如何在带有子对话框的框架上应用 MakeModal() 方法
How to apply MakeModal() method on frame with child dialog
我在 Python 27 上使用 wxPython Classic。我的文件结构如下(参见下面的代码片段):-
frame.py = 此文件包含两个 类 框架和对话框(分别为 MyFrame1 和 MyDialog1)
main.py = 这个文件导入上面的类并且还包含两个基于上面的子类(MyFrame2和MyDialog2分别)。
现在保持上面的文件结构,如何在打开对话框 window 时使框架 window 处于非活动状态?
如何才能将 MakeModal() 方法正确应用于上述文件 arrangement/structure?到目前为止,我找到的所有示例都使用了两个框架,而不是一个框架和一个对话框。
frame.py
import wx
# ************ FRAME 1 ************ #
# ************ FRAME 1 ************ #
class MyFrame1 ( wx.Frame ):
def __init__( self, parent ):
wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = wx.EmptyString, pos = wx.DefaultPosition, size = wx.Size( 500,300 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL )
self.SetSizeHintsSz( wx.DefaultSize, wx.DefaultSize )
bSizer = wx.BoxSizer( wx.VERTICAL )
self.child_button = wx.Button( self, wx.ID_ANY, u"Child Frame", wx.DefaultPosition, wx.DefaultSize, 0 )
bSizer.Add( self.child_button, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL, 5 )
self.SetSizer( bSizer )
self.Layout()
self.Centre( wx.BOTH )
# Connect Events
self.child_button.Bind( wx.EVT_BUTTON, self.On_child_button )
def __del__( self ):
pass
# Virtual event handlers, overide them in your derived class
def On_child_button( self, event ):
event.Skip()
# ************ DIALOG 1 ************ #
# ************ DIALOG 1 ************ #
class MyDialog1 ( wx.Dialog ):
def __init__( self, parent ):
wx.Dialog.__init__ ( self, parent, id = wx.ID_ANY, title = wx.EmptyString, pos = wx.DefaultPosition, size = wx.Size( 300,200 ), style = wx.DEFAULT_DIALOG_STYLE )
self.SetSizeHintsSz( wx.DefaultSize, wx.DefaultSize )
self.Centre( wx.BOTH )
# Connect Events
self.Bind( wx.EVT_CLOSE, self.onClose )
def __del__( self ):
pass
# Virtual event handlers, overide them in your derived class
def onClose( self, event ):
event.Skip()
main.py
import wx
from frame import MyFrame1, MyDialog1
class MyFrame2(MyFrame1):
def __init__(self, parent):
MyFrame1.__init__ (self, parent)
def On_child_button( self, event ):
MyDialog2(None).Show()
class MyDialog2(MyDialog1):
def __init__(self, parent):
MyDialog1.__init__ (self, parent)
def onClose(self, event):
self.Destroy()
app = wx.App(0)
MyFrame2(None).Show()
app.MainLoop()
您不需要在框架上使用 MakeModal
,因为对话框已经具有模态功能 built-in。只需调用对话框的 ShowModal
方法而不是 Show
方法。 ShowModal
将创建一个嵌套的事件循环,因此 ShowModal
在对话框完成之前不会 return,并且将阻止对应用程序中另一个 windows 的输入。典型的使用模式如下所示:
with MyDialog(self, foo, bar) as dlg:
if dlg.ShowModal() == wx.ID_OK:
# do something with dlg values
我在 Python 27 上使用 wxPython Classic。我的文件结构如下(参见下面的代码片段):-
frame.py = 此文件包含两个 类 框架和对话框(分别为 MyFrame1 和 MyDialog1)
main.py = 这个文件导入上面的类并且还包含两个基于上面的子类(MyFrame2和MyDialog2分别)。
现在保持上面的文件结构,如何在打开对话框 window 时使框架 window 处于非活动状态?
如何才能将 MakeModal() 方法正确应用于上述文件 arrangement/structure?到目前为止,我找到的所有示例都使用了两个框架,而不是一个框架和一个对话框。
frame.py
import wx
# ************ FRAME 1 ************ #
# ************ FRAME 1 ************ #
class MyFrame1 ( wx.Frame ):
def __init__( self, parent ):
wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = wx.EmptyString, pos = wx.DefaultPosition, size = wx.Size( 500,300 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL )
self.SetSizeHintsSz( wx.DefaultSize, wx.DefaultSize )
bSizer = wx.BoxSizer( wx.VERTICAL )
self.child_button = wx.Button( self, wx.ID_ANY, u"Child Frame", wx.DefaultPosition, wx.DefaultSize, 0 )
bSizer.Add( self.child_button, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL, 5 )
self.SetSizer( bSizer )
self.Layout()
self.Centre( wx.BOTH )
# Connect Events
self.child_button.Bind( wx.EVT_BUTTON, self.On_child_button )
def __del__( self ):
pass
# Virtual event handlers, overide them in your derived class
def On_child_button( self, event ):
event.Skip()
# ************ DIALOG 1 ************ #
# ************ DIALOG 1 ************ #
class MyDialog1 ( wx.Dialog ):
def __init__( self, parent ):
wx.Dialog.__init__ ( self, parent, id = wx.ID_ANY, title = wx.EmptyString, pos = wx.DefaultPosition, size = wx.Size( 300,200 ), style = wx.DEFAULT_DIALOG_STYLE )
self.SetSizeHintsSz( wx.DefaultSize, wx.DefaultSize )
self.Centre( wx.BOTH )
# Connect Events
self.Bind( wx.EVT_CLOSE, self.onClose )
def __del__( self ):
pass
# Virtual event handlers, overide them in your derived class
def onClose( self, event ):
event.Skip()
main.py
import wx
from frame import MyFrame1, MyDialog1
class MyFrame2(MyFrame1):
def __init__(self, parent):
MyFrame1.__init__ (self, parent)
def On_child_button( self, event ):
MyDialog2(None).Show()
class MyDialog2(MyDialog1):
def __init__(self, parent):
MyDialog1.__init__ (self, parent)
def onClose(self, event):
self.Destroy()
app = wx.App(0)
MyFrame2(None).Show()
app.MainLoop()
您不需要在框架上使用 MakeModal
,因为对话框已经具有模态功能 built-in。只需调用对话框的 ShowModal
方法而不是 Show
方法。 ShowModal
将创建一个嵌套的事件循环,因此 ShowModal
在对话框完成之前不会 return,并且将阻止对应用程序中另一个 windows 的输入。典型的使用模式如下所示:
with MyDialog(self, foo, bar) as dlg:
if dlg.ShowModal() == wx.ID_OK:
# do something with dlg values