Winforms 隐藏的wx.Frame将自动显示,从最小化还原后无法隐藏

Winforms 隐藏的wx.Frame将自动显示,从最小化还原后无法隐藏,winforms,wxpython,show,hidden,Winforms,Wxpython,Show,Hidden,Python 3.7+wxPython 4.0.6(与4.0.2相同)+windows 10(64位) 因为我需要一个子帧可以在主帧上浮动,所以使用样式:wx.frame\u FLOAT\u on\u PARENT 操作:首先打开子帧,然后最小化主帧。从最小化还原后,隐藏子帧(使用hide()。然后再次最小化->恢复子帧自动显示,不能隐藏。 我已经测试过了,frame.IsShown()返回False 样本如下 import wx class MainFrame(wx.Frame):

Python 3.7+wxPython 4.0.6(与4.0.2相同)+windows 10(64位)

因为我需要一个子帧可以在主帧上浮动,所以使用样式:wx.frame\u FLOAT\u on\u PARENT

操作:首先打开子帧,然后最小化主帧。从最小化还原后,隐藏子帧(使用hide()。然后再次最小化->恢复子帧自动显示,不能隐藏。 我已经测试过了,frame.IsShown()返回False

样本如下

import wx

class MainFrame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, id=-1, parent=parent, size=wx.Size(600, 500),
                          title='Test')
        self.panel = wx.Panel(self, id=-1, pos=(200, 300))
        self.button = wx.Button(self.panel, id=-1, label='button',
                                 pos=wx.Point(20, 56), size=wx.Size(87, 28))
        self.button.Bind(wx.EVT_BUTTON, self.OnButton, id=-1)
        self.frame = MyFrame(self)
    def OnButton(self, event):
        self.frame.Show()
        event.Skip()
class MyFrame(wx.Frame):
    def __init__(self, parent):
        style = wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX | \
                wx.MINIMIZE_BOX | wx.FRAME_NO_TASKBAR | wx.FRAME_FLOAT_ON_PARENT
        wx.Frame.__init__(self, id=-1, parent=parent, size=wx.Size(300, 200),
                          title='Sub', style=style)
        self.Bind(wx.EVT_CLOSE, self.OnClose)
    def OnClose(self, evt):
        self.Hide()
if __name__ == '__main__':
    app = wx.App()
    frame = MainFrame(None)
    frame.Show()
    app.MainLoop()
我不需要关闭子帧。我需要把它藏起来

具体操作如下:

  • 单击该按钮以打开子帧
  • 单击主框架的最小化按钮。(->所有帧都最小化。)
  • 单击任务栏中的图标以恢复主框架
  • 单击子帧的“×”按钮
  • 再次单击主框架的最小化按钮
  • 单击任务栏中的图标以恢复主框架
  • ->问题:显示子帧。不能用“×”按钮隐藏

    我需要在主帧失去焦点时显示子帧,所以我在父帧上使用wx.frame\u FLOAT\u


    有什么建议吗?

    我无法重现您使用wxPython 4.0.4、python 3.7和macOS描述的行为。但无论如何,我不认为您能够使用GUI关闭
    MyFrame
    ,因为您正在修改
    wx.EVT\u close
    事件的正常行为,并且在
    MyFrame.OnClose
    方法中不包括
    self.Destroy()
    或等效方法。使用您的代码,关闭
    MyFrame
    的唯一方法是关闭
    MainFrame
    ,因为您使
    MyFrame
    成为
    MainFrame
    的子对象

    然而,对于您的代码,如果
    MyFrame
    最小化,则我无法通过按下按钮再次看到它。我稍微修改了你的代码,现在我可以隐藏/最小化,然后显示/还原
    MyFrame
    。我需要删除父对象上的
    wx.FRAME\u FLOAT\u,以便
    Restore()
    方法正常工作。希望这有帮助

    import wx
    
    class MainFrame(wx.Frame):
        def __init__(self, parent):
            wx.Frame.__init__(self, id=-1, parent=parent, size=wx.Size(600, 500),
                              title='Test')
            self.panel = wx.Panel(self, id=-1, pos=(200, 300))
            self.button = wx.Button(self.panel, id=-1, label='button',
                                     pos=wx.Point(20, 56), size=wx.Size(87, 28))
            self.button.Bind(wx.EVT_BUTTON, self.OnButton, id=-1)
            self.frame = MyFrame(self)
        def OnButton(self, event):
            if self.frame.IsShown():
                self.frame.Restore()
            else:
                self.frame.Show()
    
    
    class MyFrame(wx.Frame):
        def __init__(self, parent):
            style = wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX | \
                    wx.MINIMIZE_BOX | wx.FRAME_NO_TASKBAR
            wx.Frame.__init__(self, id=-1, parent=parent, size=wx.Size(300, 200),
                              title='Sub', style=style)
            self.Bind(wx.EVT_CLOSE, self.OnClose)
        def OnClose(self, evt):
            self.Hide()
    
    if __name__ == '__main__':
        app = wx.App()
        frame = MainFrame(None)
        frame.Show()
        app.MainLoop()