Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
wxPython:确保只有一个面板实例处于打开状态_Python_Wxpython_Instance_Frame_Wxwidgets - Fatal编程技术网

wxPython:确保只有一个面板实例处于打开状态

wxPython:确保只有一个面板实例处于打开状态,python,wxpython,instance,frame,wxwidgets,Python,Wxpython,Instance,Frame,Wxwidgets,我正在编写一个多窗口、多帧的应用程序。对于打开的每个新窗口/框架,该窗口应该只有一个实例。我希望用户能够在这些窗口之间快速切换,因此showmodel()不起作用。我尝试过使用SingleInstanceChecker,但我无法让它工作,因为它更多地用于应用程序而不是框架。我应该如何做到这一点 我在谷歌上搜索了一下Fu,发现了这条老线索: 使用它作为我的模板,我把这个小脚本放在一起,它似乎可以在我的Linux机器上工作: import wx #######################

我正在编写一个多窗口、多帧的应用程序。对于打开的每个新窗口/框架,该窗口应该只有一个实例。我希望用户能够在这些窗口之间快速切换,因此
showmodel()
不起作用。我尝试过使用
SingleInstanceChecker
,但我无法让它工作,因为它更多地用于应用程序而不是框架。我应该如何做到这一点

我在谷歌上搜索了一下Fu,发现了这条老线索:

使用它作为我的模板,我把这个小脚本放在一起,它似乎可以在我的Linux机器上工作:

import wx

########################################################################
class MyPanel(wx.Panel):
    """"""

    #----------------------------------------------------------------------
    def __init__(self, parent):
        """Constructor"""
        wx.Panel.__init__(self, parent)


########################################################################
class SingleInstanceFrame(wx.Frame):
    """"""

    instance = None
    init = 0

    #----------------------------------------------------------------------
    def __new__(self, *args, **kwargs):
        """"""
        if self.instance is None:
            self.instance = wx.Frame.__new__(self)
        elif isinstance(self.instance, wx._core._wxPyDeadObject):
            self.instance = wx.Frame.__new__(self)
        return self.instance

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        print id(self)
        if self.init:
            return
        self.init = 1

        wx.Frame.__init__(self, None, title="Single Instance Frame")
        panel = MyPanel(self)
        self.Show()



########################################################################
class MainFrame(wx.Frame):
    """"""

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        wx.Frame.__init__(self, None, title="Main Frame")
        panel = MyPanel(self)
        btn = wx.Button(panel, label="Open Frame")
        btn.Bind(wx.EVT_BUTTON, self.open_frame)
        self.Show()

    #----------------------------------------------------------------------
    def open_frame(self, event):
        frame = SingleInstanceFrame()

if __name__ == '__main__':
    app = wx.App(False)
    frame = MainFrame()
    app.MainLoop()

除了迈克的答案,我还找到了另一种方法,所以我想我会把它贴出来,以防有人需要

SingleInstanceChecker
实际上适用于wx.Frames和wx.panel。它的工作方式与应用程序中的工作方式相同

将这段代码片段放入面板的
\uuuu init\uuu
功能中

self.instance = wx.SingleInstanceChecker(self.name)
然后,在实例化面板时,将其称为:

    if panel.instance.IsAnotherRunning():
      wx.MessageBox("Another instance is running!", "ERROR")
      return
它的工作原理和你期望的完全一样