WXPYTHON:如何检查框架是否已经可见?

时间:2014-05-28 01:49:57

标签: wxpython

我试图阻止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)

1 个答案:

答案 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()作为上述示例。