Скрытый wx.Frame отображается автоматически и не может быть скрыт после восстановления из минимизации

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

Мне не нужно закрывать подрамник. Мне нужно это скрыть.

Детальные операции:

  1. Нажмите кнопку, чтобы открыть подкадр.
  2. Нажмите кнопку сворачивания основного фрейма. (-> Все кадры свернуты.)
  3. Щелкните значок на панели задач, чтобы восстановить основной фрейм.
  4. Нажмите кнопку «×» подкадра.
  5. Нажмите кнопку свертывания основного фрейма еще раз.
  6. Щелкните значок на панели задач, чтобы восстановить основной фрейм.

-> Проблема: отображается подкадр. И не может использовать кнопку «×», чтобы скрыть это.

Мне нужно, чтобы подкадр отображался на основном кадре, когда он теряет фокус, поэтому я использовал wx.FRAME_FLOAT_ON_PARENT.

Любой совет?


person Lind    schedule 20.04.2020    source источник


Ответы (1)


Я не могу воспроизвести поведение, которое вы описываете, используя wxPython 4.0.4, python 3.7 и macOS. Но в любом случае, я не думаю, что вы сможете закрыть 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()
person kbr85    schedule 20.04.2020