Скрытый wx.Frame отображается автоматически и не может быть скрыт после восстановления из минимизации - PullRequest
2 голосов
/ 20 апреля 2020

Python 3.7 + wx Python 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.

Любой совет?

1 Ответ

0 голосов
/ 20 апреля 2020

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