我试图阻止File -> Preferences
菜单打开自己的多个副本。我以为我可以使用IsShown()
执行此操作,但它一直在返回False
?使用下面的代码片段,当我使用菜单时,它会打开框架,然后如果它仍然打开并再次使用菜单,它只会打开另一个菜单,但永远不会返回True?
代码段:
def OnPref(self, event):
frame = PreferencesFrame()
print frame.IsShown() # Debugging to check Shown() state.
if frame.IsShown():
print "already shown"
else:
frame.Show(True)
答案 0 :(得分:3)
有多种方法可以做到这一点 -
1。通常,在打开设置或首选项窗口时,软件不允许访问顶级框架。您可能已在许多应用程序中看到过这一点因此,您最好的尝试是在打开首选项窗口之前禁用主窗口。这可以使用
完成frame_2 = MyFrame2(None, wx.ID_ANY, "") #frame_2 object is created
frame_2.MakeModal(True) #makes frame_2 our temporary top window. This means that frame_1 cannot be accessed now and can only be accessed after frame_2 is closed
frame_2.Show() #shows frame_2
我们假设frame_1
已作为顶级窗口存在,frame_2
正在frame_1
内创建。要在关闭frame_1
后再次激活frame_2
,您必须执行
self.MakeModal(False)
以下是frame_2
self.Bind(wx.EVT_CLOSE, self.on_Close)
def on_Close(self, event):
self.MakeModal(False)
frame_1.Show() #frame_1 becomes active again
event.Skip() #after we have executed our custom set of instructions it is a good idea to skip the event so that python can de-allocate memory and perform other routine tasks
2。我的猜测IsShown()
适用于小部件而非框架,因此您可以从偏好框架中选择一些按钮或文本框,并将其与IsShown()
一起使用检查框架是否已经可见。然而,这是实现目标的间接方式。您可能会发现以下示例很有用
import wx
class Frame(wx.Frame):
def __init__(self, parent=None, id=-1, title='Title', pos=wx.DefaultPosition, size=(300, 300)):
wx.Frame.__init__(self, parent, id, title, pos, size)
self.panel = wx.Panel(self, -1, pos=(0, 0), size=(300, 300))
self.b = wx.Button(self.panel, -1, "Click me!", (50,50))
self.Bind(wx.EVT_BUTTON, self.OnButton, self.b)
result = self.b.IsShown()
print "Button visible? : %s" % (result)
def OnButton(self, evt):
self.b.Hide( )
result = self.b.IsShown()
print "Button visible? : %s" % (result)
class App(wx.App):
def OnInit(self):
self.frame = Frame()
self.frame.Show()
return True
def main():
app = App()
app.MainLoop()
if __name__ == '__main__':
main()
3。如果IsShownOnScreen()
在您的情况下不起作用,请尝试使用IsShown()
作为上述示例。