winforms - 隐藏的 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()
我不需要关闭子框架。我需要隐藏它。
具体操作如下:
- 单击按钮打开子框架。
- 单击主框架的最小化按钮。(-> 所有的帧都被最小化了。)
- 单击任务栏中的图标可恢复主框架。
- 单击子帧的“×”按钮。
- 再次单击主框架的最小化按钮。
- 单击任务栏中的图标可恢复主框架。
-> 问题:显示子框架。并且不能使用“×”按钮来隐藏它。
我需要在失去焦点时显示在主框架上的子框架,所以我使用了 wx.FRAME_FLOAT_ON_PARENT。
有什么建议吗?
解决方案
我无法重现您使用 wxPython 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()
推荐阅读
- java - Selenim chrome 驱动程序无法定位嵌套
- 标签
- vue.js - Vue - 将 v-for 索引从父组件传递到子组件
- javascript - Redux Saga 等待进行 api 调用的动作创建者
- python - 通过 Python 提取 PowerPoint 文本属性
- ansible - 使用替换模块的ansible任务运行正常,但字符串未被替换
- c# - 如果我像这样频繁地运行查询,我应该如何处理 MySQL 连接?
- c - 使用 CLion 调试器检查 C 中动态分配的二维数组
- arrays - 将二维数组传递给 C 中的函数
- asp.net-core - 如何告诉 dotnet ef database update 命令迁移文件所在的位置
- reactjs - 阻止 Chip 组件发送 REST 请求