2016-07-13 1 views
0

Этот код является одним из ответов на вопрос о всплывающем окне на веб-сайте. Я хочу, чтобы подкадр был открыт, когда нажата кнопка textctrl, и мейнфрейм закрывается одновременно, и данные передаются обратно на мейнфрейм после нажатия кнопки «сохранить и закрыть», теперь код может открыть подзаголовок и закрыть mainwindow, однако, каждый раз, когда я нажимал кнопку «Сохранить и закрыть», главное окно появляется в секунде, и снова отображается окно. Я предполагаю, что фокус автоматически установлен в текстовое поле, поэтому вы можете помочь настроить фокусировку на основную панель или мэйнфрейм для решения проблемы.Как установитьFoucus на mainpanel или mainframe

import wx 
from wx.lib.pubsub import Publisher 


######################################################################## 
class OtherFrame(wx.Frame): 
    """""" 

    #---------------------------------------------------------------------- 
    def __init__(self): 
     """Constructor""" 
     wx.Frame.__init__(self, None, wx.ID_ANY, "Secondary Frame") 
     panel = wx.Panel(self) 

     msg = "Enter a Message to send to the main frame" 
     instructions = wx.StaticText(panel, label=msg) 
     self.msgTxt = wx.TextCtrl(panel, value="") 
     closeBtn = wx.Button(panel, label="Send and Close") 
     closeBtn.Bind(wx.EVT_BUTTON, self.onSendAndClose) 

     sizer = wx.BoxSizer(wx.VERTICAL) 
     flags = wx.ALL|wx.CENTER 
     sizer.Add(instructions, 0, flags, 5) 
     sizer.Add(self.msgTxt, 0, flags, 5) 
     sizer.Add(closeBtn, 0, flags, 5) 
     panel.SetSizer(sizer) 

    #---------------------------------------------------------------------- 
    def onSendAndClose(self, event): 
     """ 
     Send a message and close frame 
     """ 
     msg = self.msgTxt.GetValue() 
     Publisher().sendMessage(("show.mainframe"), msg) 
     self.Close() 


######################################################################## 
class MainPanel(wx.Panel): 
    """""" 

    #---------------------------------------------------------------------- 
    def __init__(self, parent): 
     """Constructor""" 
     wx.Panel.__init__(self, parent=parent) 
     self.frame = parent 

     Publisher().subscribe(self.showFrame, ("show.mainframe")) 


     self.pubsubText = wx.TextCtrl(self, value="") 

     self.pubsubText.Bind(wx.EVT_SET_FOCUS,self.hideFrame) 


     Btn = wx.Button(self, label="Change") 

     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(self.pubsubText, 0, wx.ALL|wx.CENTER, 5) 
     sizer.Add(Btn, 0, wx.ALL|wx.CENTER, 5) 
     self.SetSizer(sizer) 

    #---------------------------------------------------------------------- 
    def hideFrame(self, event): 
     """""" 
     self.frame.Hide() 
     new_frame = OtherFrame() 
     new_frame.Show() 

    #---------------------------------------------------------------------- 
    def showFrame(self, msg): 
     """ 
     Shows the frame and shows the message sent in the 
     text control 
     """ 
     self.pubsubText.SetValue(msg.data) 
     frame = self.GetParent() 
     frame.Show() 

######################################################################## 
class MainFrame(wx.Frame): 

    #---------------------------------------------------------------------- 
    def __init__(self): 
     wx.Frame.__init__(self, None, wx.ID_ANY, "Pubsub Tutorial") 
     panel = MainPanel(self) 

#---------------------------------------------------------------------- 
if __name__ == "__main__": 
    app = wx.App(False) 
    frame = MainFrame() 
    frame.Show() 
    app.MainLoop() 

ответ

0

Причина, по которой это происходит, заключается в том, что вы привязываетесь к неправильному событию. EVT_SET_FOCUS срабатывает всякий раз, когда элемент управления текстом находится в фокусе. Когда вы нажимаете на него, он фокусируется. Он также возвращается в фокус, когда вы закрываете второй кадр и вытаскиваете первый назад, поэтому вы снова видите второй кадр.

Вместо этого вы должны привязать к wx.EVT_LEFT_DOWN, что является событием мыши. Вот обновленный код:

import wx 
from wx.lib.pubsub import Publisher 


######################################################################## 
class OtherFrame(wx.Frame): 
    """""" 

    #---------------------------------------------------------------------- 
    def __init__(self): 
     """Constructor""" 
     wx.Frame.__init__(self, None, wx.ID_ANY, "Secondary Frame") 
     panel = wx.Panel(self) 

     msg = "Enter a Message to send to the main frame" 
     instructions = wx.StaticText(panel, label=msg) 
     self.msgTxt = wx.TextCtrl(panel, value="") 
     closeBtn = wx.Button(panel, label="Send and Close") 
     closeBtn.Bind(wx.EVT_BUTTON, self.onSendAndClose) 

     sizer = wx.BoxSizer(wx.VERTICAL) 
     flags = wx.ALL|wx.CENTER 
     sizer.Add(instructions, 0, flags, 5) 
     sizer.Add(self.msgTxt, 0, flags, 5) 
     sizer.Add(closeBtn, 0, flags, 5) 
     panel.SetSizer(sizer) 

    #---------------------------------------------------------------------- 
    def onSendAndClose(self, event): 
     """ 
     Send a message and close frame 
     """ 
     msg = self.msgTxt.GetValue() 
     Publisher().sendMessage(("show.mainframe"), msg) 
     self.Close() 


######################################################################## 
class MainPanel(wx.Panel): 
    """""" 

    #---------------------------------------------------------------------- 
    def __init__(self, parent): 
     """Constructor""" 
     wx.Panel.__init__(self, parent=parent) 
     self.frame = parent 

     Publisher().subscribe(self.showFrame, ("show.mainframe")) 


     self.pubsubText = wx.TextCtrl(self, value="") 

     #### NOTE CHANGE HERE #### 
     self.pubsubText.Bind(wx.EVT_LEFT_DOWN,self.hideFrame) 


     Btn = wx.Button(self, label="Change") 

     sizer = wx.BoxSizer(wx.VERTICAL) 
     sizer.Add(self.pubsubText, 0, wx.ALL|wx.CENTER, 5) 
     sizer.Add(Btn, 0, wx.ALL|wx.CENTER, 5) 
     self.SetSizer(sizer) 

    #---------------------------------------------------------------------- 
    def hideFrame(self, event): 
     """""" 
     self.frame.Hide() 
     new_frame = OtherFrame() 
     new_frame.Show() 

    #---------------------------------------------------------------------- 
    def showFrame(self, msg): 
     """ 
     Shows the frame and shows the message sent in the 
     text control 
     """ 
     self.pubsubText.SetValue(msg.data) 
     frame = self.GetParent() 
     frame.Show() 

######################################################################## 
class MainFrame(wx.Frame): 

    #---------------------------------------------------------------------- 
    def __init__(self): 
     wx.Frame.__init__(self, None, wx.ID_ANY, "Pubsub Tutorial") 
     panel = MainPanel(self) 

#---------------------------------------------------------------------- 
if __name__ == "__main__": 
    app = wx.App(False) 
    frame = MainFrame() 
    frame.Show() 
    app.MainLoop() 
+0

Большое спасибо, что помогает много и решить мою проблему – Tyler

+0

@Tyler Если данный ответ, ответ на ваш вопрос, то вы должны принять его, если вы нашли его полезным, то нажмите «Полезно», стрелка вверх. Вы можете, конечно, сделать обоим, если хотите. –