WPF,wxPython 和 PyQt5 单例模式

很多时候, 我们开发的应用程序, 我不希望程序被点击多次的时候, 打开多个窗口,我只希望最终都是一个窗口存在, 这就是单例模式了lin49940。

  • WPF, 在App.xaml.cs 里面
  protected override void OnStartup(StartupEventArgs e)
          {
              //当前运行WPF程序的进程实例
              Process process = Process.GetCurrentProcess();
              //遍历WPF程序的同名进程组
              foreach (Process p in Process.GetProcessesByName(process.ProcessName))
              {
                  //不是同一进程,则关闭后面开的进程
                 if (p.Id != process.Id)
                 {  //这个地方用kill 而不用Shutdown();的原因是,
                    //Shutdown关闭程序在进程管理器里进程的释放有延迟不是马上关闭进程的
                    process.Kill();
                    return;
                 }
            }
            base.OnStartup(e);
         }

附带一个WPF 窗口最大化(非全屏化),在MainWindow.xaml.cs

public MainWindow()
        {
            InitializeComponent();
            this.WindowState = System.Windows.WindowState.Maximized;
            //网上很多人这里用none 样式,会导致标题栏没有了
            this.WindowStyle = System.Windows.WindowStyle.SingleBorderWindow;
        }

wxPython, 在wx.App 的子类里面

    def OnInit(self):
        self.name = "AgvLin49940-%s" % wx.GetUserId()
        self.instance = wx.SingleInstanceChecker(self.name)
        if self.instance.IsAnotherRunning():
            return False
        # 你的其他代码
        return True

PyQt5,MainWindow 里面:

from PyQt5.QtNetwork import QLocalSocket, QLocalServer

class MainWindow(QMainWindow):
if __name__ == '__main__':
    try:
        app=QApplication(sys.argv)
        serverName = 'agvlin49940'
        socket = QLocalSocket()
        socket.connectToServer(serverName)
        # 如果连接成功,表明server已经存在,当前已有实例在运行
        if socket.waitForConnected(500):
            app.quit()
        else:
            localServer = QLocalServer()  # 没有实例运行,创建服务器
            localServer.listen(serverName)
            # 处理其他
            win = MainWindow()
            win.showMaximized()
            win.show()
            app.exit(app.exec_())
            pass
    except:
        pass

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值