3

Pythonでサービスを作成してGoogle Chrome拡張機能からテキストを送信できるようにする必要があります。このサービスはSTDIOから読み込み、次に小さな処理を行い、それをSTDOUTを介してクロムエクステンションに送り返します。STDIOから読み込んでSTDOUTにループで書き込むPythonでサービスを作成する

I持って、私はあなたが以下のURLで持っている[サンプルホスト]からもらった次のコード:

https://developer.chrome.com/extensions/nativeMessaging#examples

私の問題私がしたいことをこのコードはウィンドウ(ユーザーインターフェース)を有していることです除去する。

このコードにはメインループが必要です。そのため、Google Chromeの拡張機能からのリクエストはいつでも保留されています。

#!/usr/bin/env python 

import struct 
import sys 
import threading 
import Queue 
try: 
    import Tkinter 
    import tkMessageBox 
except ImportError: 
    Tkinter = None 

if sys.platform == "win32": 
    import os, msvcrt 
    msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY) 
    msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY) 

def send_message(message): 
    sys.stdout.write(struct.pack('I', len(message))) 
    sys.stdout.write(message) 
    sys.stdout.flush() 

def read_thread_func(queue): 
    while 1: 
     text_length_bytes = sys.stdin.read(4) 
     if len(text_length_bytes) == 0: 
      if queue: 
       queue.put(None) 
      sys.exit(0) 
     text_length = struct.unpack('i', text_length_bytes)[0] 
     text = sys.stdin.read(text_length).decode('utf-8') 
     if queue: 
      queue.put(text) 

if Tkinter: 
    class NativeMessagingWindow(Tkinter.Frame): 
    def __init__(self, queue): 
     self.queue = queue 
     Tkinter.Frame.__init__(self) 
     self.pack() 
     self.text = Tkinter.Text(self) 
     self.text.grid(row=0, column=0, padx=10, pady=10, columnspan=2) 
     self.text.config(state=Tkinter.DISABLED, height=10, width=40) 
     self.messageContent = Tkinter.StringVar() 
     self.sendEntry = Tkinter.Entry(self, textvariable=self.messageContent) 
     self.sendEntry.grid(row=1, column=0, padx=10, pady=10) 
     self.sendButton = Tkinter.Button(self, text="Send", command=self.onSend) 
     self.sendButton.grid(row=1, column=1, padx=10, pady=10) 
     self.after(100, self.processMessages) 
    def processMessages(self): 
     while not self.queue.empty(): 
     message = self.queue.get_nowait() 
     if message == None: 
      self.quit() 
      return 
     self.log("Received %s" % message) 
     self.after(100, self.processMessages) 
    def onSend(self): 
     text = '{"text": "' + self.messageContent.get() + '"}' 
     self.log('Sending %s' % text) 
     try: 
     send_message(text) 
     except IOError: 
     tkMessageBox.showinfo('Native Messaging Example', 
           'Failed to send message.') 
     sys.exit(1) 
    def log(self, message): 
     self.text.config(state=Tkinter.NORMAL) 
     self.text.insert(Tkinter.END, message + "\n") 
     self.text.config(state=Tkinter.DISABLED) 

def Main(): 
    if not Tkinter: 
    send_message('"Tkinter python module wasn\'t found. Running in headless ' + 
       'mode. Please consider installing Tkinter."') 
    read_thread_func(None) 
    sys.exit(0) 
    queue = Queue.Queue() 
    main_window = NativeMessagingWindow(queue) 
    main_window.master.title('Native Messaging Example') 
    thread = threading.Thread(target=read_thread_func, args=(queue,)) 
    thread.daemon = True 
    thread.start() 
    main_window.mainloop() 
    sys.exit(0) 

if __name__ == '__main__': 
    Main() 

GUIを削除し、外部の要求に保留中のプログラムを作成する方法上の任意のアイデア?

+0

Chromeは、登録されたネイティブホストアプリケーションを、少なくともWindowsでは隠しウィンドウ(コンソールアプリケーションを含む)で起動します。 – wOxxOm

+0

'Tkinter'コードをすべて削除してみませんか? –

+0

私は試しましたが成功しなかった、私はそれがすべての相互接続されていると思う – Angel

答えて

1

質問を正しく解釈している場合は、プログラムを実行し続けてもコンソールウィンドウを表示しないようにします。これを行うには、ファイルの拡張子を.pyから.pywに変更するだけです。

+0

しかし、私はすべてのウィンドウがないコードが必要です。私はそれを取り除きたい。私がしたいことは、STDINからテキストを受け取ると、テキストが "*** ***"のように変換され、この変換がSTDOUTに戻されるということです。そして、私は、コードは、すべての時間をさらに聞く必要があります。つまり、私は拡張機能を変更するだけではなく、何かを求めています。実際には、実行しているコードには拡張子がありません。 GUIウィンドウでうまく動作します。 – Angel

+0

@Aditya ChaurasiaはWindowsでのみ動作し、tk guiを抑制しません。 –

+0

@ t.m.adamあなたは正しいです、今同じことを探していますか?多分、私たちは一緒にstackoverflowチャットで調査することができます。私はこれを探していますが、今のところ役に立たなかったのです。 – Angel

関連する問題