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

问题描述 投票:2回答:2

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

因为我需要一个可以在主框架上浮动的子框架,所以请使用样式:wx.FRAME_FLOAT_ON_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()

有什么建议吗?

winforms wxpython show hidden
2个回答
0
投票

我无法重现您使用wxPython 4.0.4,python 3.7和macOS描述的行为。但是无论如何,我认为您将无法使用GUI关闭MyFrame,因为您正在修改wx.EVT_CLOSE事件的正常行为,并且在self.Destroy()方法中不包含MyFrame.OnClose或等效项。对于您的代码,关闭MyFrame的唯一方法是关闭MainFrame,因为您将MyFrame设为MainFrame的子级。

尽管如此,对于您的代码,如果将MyFrame最小化,则无法通过按按钮再次看到它。我稍微更改了代码,现在可以隐藏/最小化,然后显示/恢复MyFrame。我需要删除wx.FRAME_FLOAT_ON_PARENT才能使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()

0
投票

@@ kbr85谢谢您的评论。也许我没有清楚地说明。我不需要关闭子框架。我需要隐藏它。

详细操作是:

  1. 单击按钮以打开子框架。
  2. 单击主机]的最小化按钮。 (->将所有帧最小化。)
  3. 单击任务栏中的图标以还原主机。
  4. 单击子帧
  5. 的“×”按钮。 再次
  6. 单击主机]的最小化按钮。
  7. 单击任务栏中的图标以还原主机。

    ->问题:显示了子帧。并且不能使用“×”按钮将其隐藏。

  8. 我需要失去焦点时显示在主框架上的子框架,所以我使用了wx.FRAME_FLOAT_ON_PARENT。

© www.soinside.com 2019 - 2024. All rights reserved.