尝试打开该应用程序的新实例时如何显示该应用程序的窗口

Nic*_*ire 6 python gtk multiple-instances application-development

我知道这个问题有点含糊。我将尝试在下面更好地解释:

我的应用程序(python/gtk)主要是一个指标。使用此指示器,您可以选择显示/隐藏主窗口。

当我尝试打开应用程序的新实例时,我创建了它,以便它检查应用程序是否已经在运行。如果是这样,它将中止尝试运行该应用程序。

现在我想调整它,所以在中止之前我希望它把已经激活的应用程序的主窗口带到前台。即使这个窗口目前没有打开。

所以我相信我的问题是:我怎样才能从我的新应用程序中获得一个(全局?)我已经激活的应用程序的变量/实例?(所以我可以把我的主窗口带到前台)

编辑:

我刚刚在 api 中找到了这个方法:GtkWindow - set_startup_id()

这说:通常,启动标识符是自动管理的,您应该只在特殊情况下使用此功能,例如从其他进程转移焦点。

所以这意味着应该可以将焦点从另一个进程带到一个窗口。但是我怎么会得到这个ID呢?我将如何使用这个 id 将它带到前台?

xub*_*tix 1

首先我们要说的是,方法有很多很多。您通常在程序启动时设置一个令牌/标识符,以便稍后的实例可以查找该令牌是否存在。

我将描述一种使用 dbus 的方法。

概述:

当启动一个程序时,它可以在会话dbus上以唯一的名称(例如“org.nicklemaire.myprogram”)注册自己。程序的其他实例可以检查这样的访问点是否已经注册,如果是,则告诉程序通过该 dbus 访问点做什么(例如获得焦点、打开网站、播放歌曲)。当您想要类似于“firefox askubuntu.com”的行为时,最后一部分可能是必要的,该行为会在已运行的实例中的新选项卡中打开此页面。

代码:

#!/usr/bin/env python                                                                                                                           
import sys                                                                                                                                      
import gtk                                                                                                                                      
import dbus                                                                                                                                     
import dbus.service                                                                                                                             
from dbus.mainloop.glib import DBusGMainLoop                                                                                                    
from multiprocessing import Process                                                                                                             

class MyDBUSService(dbus.service.Object):                                                                                                       
    def __init__(self):                                                                                                                         
        bus_name = dbus.service.BusName('org.nicklemaire.myprogram', bus=dbus.SessionBus())                                                     
        dbus.service.Object.__init__(self, bus_name, '/org/nicklemaire/myprogram')                                                              

    @dbus.service.method('org.nicklemaire.myprogram', in_signature='s')                                                                         
    def startup(self, arg):                                                                                                                     
        print "got the following parameter from another instance:", arg                                                                         

def call_instance():                                                                                                                            
    try:                                                                                                                                        
        bus = dbus.SessionBus()                                                                                                                 
        programinstance = bus.get_object('org.nicklemaire.myprogram',  '/org/nicklemaire/myprogram')                                            
        bus = dbus.SessionBus()                                                                                                                 
        programinstance = bus.get_object('org.nicklemaire.myprogram',  '/org/nicklemaire/myprogram')                                            
        startup = programinstance.get_dbus_method('startup', 'org.nicklemaire.myprogram')                                                       
        try:                                                                                                                                    
            arg = sys.argv[1]                                                                                                                   
        except IndexError:                                                                                                                      
            arg = ""                                                                                                                            
        startup(arg)                                                                                                                            
        print "Another instance was running and notified."                                                                                      
    except dbus.exceptions.DBusException:                                                                                                       
        exit(-1) # process had an error                                                                                                         

if __name__ == "__main__":                                                                                                                      
    p = Process(target=call_instance)                                                                                                           
    p.start() 
    p.join()                                                                                                                                    
    if p.exitcode > 0: # process had an error                                                                                                   
        DBusGMainLoop(set_as_default=True)                                                                                                      
        myservice = MyDBUSService()                                                                                                             
        gtk.main()
Run Code Online (Sandbox Code Playgroud)

测试:

打开终端并运行程序:myprogram.py。它不会终止,因为我们当前希望让它运行并等待第二个实例启动。

现在执行此操作:打开另一个终端并再次运行该程序,这次使用附加参数myprogram.py askubuntu.com。它应该打印:“另一个实例正在运行并收到通知。” 在第一个终端中,您应该得到与此类似的输出:“从另一个实例获取以下参数:askubuntu.com”

您问题的另一部分:提出程序的描述如下:https ://stackoverflow.com/questions/9054462/how-do-i-raise-a-window-that-is-minimized-or-covered-with- pyg对象

基本上,您必须调用mywindow.present()startup方法。


Dav*_*usa 0

不确定这是否是您要找的 ID:

打开System Monitor,方法是转到应用程序,按CTRL+ALT+DEL或输入 终端gnome-system-monitor

转到View顶部栏上的选项卡。选择All Processes和依赖关系。转到Edit顶部栏上的选项卡,然后打开Preferences

Processes选项卡上的 下Information Fields,选择ID

然后尝试在列表中找到您的程序。祝你好运!