Nic*_*ire 6 python gtk multiple-instances application-development
我知道这个问题有点含糊。我将尝试在下面更好地解释:
我的应用程序(python/gtk)主要是一个指标。使用此指示器,您可以选择显示/隐藏主窗口。
当我尝试打开应用程序的新实例时,我创建了它,以便它检查应用程序是否已经在运行。如果是这样,它将中止尝试运行该应用程序。
现在我想调整它,所以在中止之前我希望它把已经激活的应用程序的主窗口带到前台。即使这个窗口目前没有打开。
所以我相信我的问题是:我怎样才能从我的新应用程序中获得一个(全局?)我已经激活的应用程序的变量/实例?(所以我可以把我的主窗口带到前台)
编辑:
我刚刚在 api 中找到了这个方法:GtkWindow - set_startup_id()。
这说:通常,启动标识符是自动管理的,您应该只在特殊情况下使用此功能,例如从其他进程转移焦点。
所以这意味着应该可以将焦点从另一个进程带到一个窗口。但是我怎么会得到这个ID呢?我将如何使用这个 id 将它带到前台?
首先我们要说的是,方法有很多很多。您通常在程序启动时设置一个令牌/标识符,以便稍后的实例可以查找该令牌是否存在。
我将描述一种使用 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
方法。
不确定这是否是您要找的 ID:
打开System Monitor
,方法是转到应用程序,按CTRL+ALT+DEL
或输入 终端gnome-system-monitor
。
转到View
顶部栏上的选项卡。选择All Processes
和依赖关系。转到Edit
顶部栏上的选项卡,然后打开Preferences
。
在Processes
选项卡上的 下Information Fields
,选择ID
。
然后尝试在列表中找到您的程序。祝你好运!
归档时间: |
|
查看次数: |
2641 次 |
最近记录: |