2014-06-24 41 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() 
相關問題