2014-06-24 44 views
0

我在pygtk中编写了一个简单的文本编辑器,它工作正常,我的问题是在我的程序运行时在新标签页中打开新文件,如记事本++和许多其他文本编辑器。如何将数据发送到正在运行的进程?

假设我的程序正在运行,我打开了一个简单的文本文件,然后我在我的磁盘上选择一个新文件,右键单击它,然后选择我的程序打开,我的目标是打开此文件在一个新的选项卡上,在我正在运行的程序中,但是会发生什么,我的程序又作为一个新进程重新开始。

我可以以某种方式与我的程序进程进行通信并发送新的文件,或者有更好的方法吗?

回答

0

我会使用套接字。

此代码在运行时会检查套接字是否已在监听。如果是这样,这意味着应用程序的另一个实例已经在运行,所以它只是传递它的第一个参数(当您右键单击打开它时由操作系统传递给它的文件路径)并关闭它。

如果没有套接字在监听,(没有应用程序打开),它会打开一个套接字,然后运行主GTK窗口。随后运行发送的任何文件路径都会显示出来,在这里您可以打开另一个选项卡。

CAVEAT:我不经常使用套接字,所以很可能有些事情没有被正确完成,并且可能导致挂起。

查看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() 
相关问题