2017-02-06 10 views
0

은 (코드는 아래 니펫을 참조) -자식 대화 상자가 프레임에 MakeModal() 방법을 적용하는 방법 나는 다음과 같은 내 파일 구조를 가지고 파이썬 (27)에 wxPython에 클래식을 사용하고

frame.py =이 파일은 프레임과 대화 (각각 MyFrame1 및 MyDialog1) 두 종류

main.py = 클래스 현제 파일 임포트를 포함하고, 또한 상기 (MyFrame2 및 MyDialog2 각각)에 기초하여 두 개의 서브 클래스를 포함한다.

위와 같이 파일 구조를 유지하면 대화 상자 창이 열릴 때 프레임 창을 비활성 상태로 만들려면 어떻게해야합니까?

위의 파일 배열/구조에 MakeModal() 메서드를 어떻게 적절하게 적용 할 수 있습니까? 지금까지 발견 한 모든 예제는 프레임과 대화 상자 대신에 두 개의 프레임을 사용합니다.

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() 
+0

ShowModal()을 대신 사용하십시오. – Igor

답변

0

당신은 대화 상자가 이미 가지고있는 양상 기능이 내장 된 프레임에 MakeModal를 사용할 필요가 없습니다 -에서. Show 메서드 대신 다이얼로그의 ShowModal 메서드를 호출하면됩니다. ShowModal은 중첩 된 이벤트 루프를 만들므로 ShowModal은 대화 상자가 끝나고 응용 프로그램의 다른 창으로의 입력이 차단 될 때까지 반환되지 않습니다. 일반적인 사용 패턴은 다음과 같습니다.

with MyDialog(self, foo, bar) as dlg: 
    if dlg.ShowModal() == wx.ID_OK: 
     # do something with dlg values 
+0

감사합니다. 완벽하게 작동합니다. –