我在pygtk中编写了一个简单的文本编辑器,它运行正常,我的问题是在程序运行时在新选项卡中打开新文件,比如notepad ++和许多其他文本编辑器。
假设我的程序正在运行,我在其中打开了一个简单的文本文件,然后在磁盘上选择一个新文件,右键单击它,然后选择要打开的程序,我的目标是打开此文件一个新的选项卡,在我正在运行的程序中,但是会发生什么,我的程序再次作为一个新进程启动。
我可以以某种方式与我的程序进程通信并发送我的新文件,还是有更好的方法来做到这一点?
答案 0 :(得分:0)
我使用套接字。
此代码在运行时将检查套接字是否已在侦听。如果是这样,这意味着应用程序的另一个实例已经在运行,因此它只是将其第一个参数(操作系统右键单击打开时传递给它的文件路径)传递给它并关闭。
如果没有套接字正在侦听,(没有应用程序打开)它会打开一个套接字,然后运行主GTK窗口。显示后续运行发送的任何文件路径,在这里您可以打开另一个选项卡。
CAVEAT:我不经常使用套接字,因此很可能有些事情没有100%正确完成,并且可能会导致挂起。
查看here以获取套接字指南。
import socket
import select
import sys
import gtk
if len (sys.argv) > 1:
filename = sys.argv[1]
else:
filename = ''
class MyApp():
def __init__(self, filename):
self.filename = filename
win = gtk.Window()
win.set_size_request(320,200)
win.connect('destroy',gtk.main_quit)
tv = gtk.TextView()
self.buff = tv.get_buffer()
win.add(tv)
win.show_all()
self.open_file()
# This timeout runs check_for_file every 200ms
gtk.timeout_add(200, self.check_for_file)
def check_for_file(self):
"""
Check if filename is waiting to be read from the socket
open file if it is
"""
readable,writeable,inerror = select.select([serversock],[],[],0)
if len (readable) > 0:
client,addr = serversock.accept()
self.filename = client.recv(1024)
self.open_file()
# Must always return 'True', or the timeout loop will stop.
return(True)
def open_file(self):
"""Dummy function, prints filename to open"""
self.buff.insert_at_cursor('Opening file {}\n'.format(self.filename))
if __name__ == '__main__':
"""
Try to open connection to a socket. If successfull, app is already
running, send filename to it and quit.
If unsuccessful, app is NOT running, open a listening socket and run
app.
"""
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
sock.connect(('localhost',4689))
except socket.error:
serversock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversock.bind(('localhost',4689))
serversock.listen(2)
else:
sock.send(filename)
sock.close()
sys.exit()
app = MyApp(filename)
gtk.main()
serversock.close()