2017-01-04 1 views
1

からサーバーを実行した後、私は別のPythonのWebサーバ、サーバ・ビーイングを作成するプログラムを作っています:Tkinterのウィンドウフリーズスクリプト

import os, sys 
from http.server import HTTPServer, CGIHTTPRequestHandler 

webdir = '.' 
port = 8000 
print('Server Now Running') 
os.chdir(webdir) 
srvraddr = (('' , port)) 
srvrobj = HTTPServer(srvraddr, CGIHTTPRequestHandler) 
srvrobj.serve_forever() 

、その後、元のプログラムは、コマンドラインからそのサーバーを実行します:

def runServer(self): 
    os.system('Webserver.py') 

これはすべてTkinterウィンドウのボタンで行われます。この関数が呼び出されると、Tkinterウィンドウがフリーズし、次のボタンを押すことができなくなります(Safariのローカルhtmlファイルをサーバー経由でプルする)。

私は周りを見回していると私は、スレッドか何かを必要とするかもしれないように見える...

私はこれについて行く方法についての無知残っていています。必要に応じて私の元のプログラムをさらに提供することができます(それはちょっとしたものです)。

私は、正しい方向に向かうための簡単な解決策または特定の参考資料を探しています。

Pythonには非常に新しい(3か月間)ので、この点に留意してください。

+2

'os.system'を実行すると、終了するまで待機します。そして、mainloopはキー/マウスイベントを受け取り、ウィジェットに送信し、ウィジェットを再描画します。サーバーを分離されたスレッド/プロセスとして実行するには 'threading'または' subprocess'モジュールが必要です。 'はその仕事をすることができます。 – furas

+0

これを今調査しています...私はこのプログラムでどのように見えるか考えていただけますか? – peer

+0

[スレッド](https://docs.python.org/3.5/library/threading.html)と[サブプロセス](https://docs.python.org/3.5/library/subprocess.html) – furas

答えて

2

使用subprocess

import subprocess 

s = subprocess.Popen(['Webserver.py']) 

または多分それは

s = subprocess.Popen(['python', 'Webserver.py']) 

またはあなたが

を処理停止することができます

s = subprocess.Popen(['python3', '-m', 'http.server', '--cgi', '8000']) 

以降を実行できるスクリプトを起動するpythonが必要になりますあなたが近いプログラムサブプロセスはまだので、あなたがあなたの近くにプログラムする前にそれらを殺すために持っている作品の後に(引数shell=Trueなし)

s.kill() 

  • Popenはリスト
  • として引数を期待しています。
+0

完全に機能しました!それは信じられないほど簡単でした。ここに私の新しい機能があります:def runServer(self): \t \t nm = self.e2 \t \t fld = "/ Users/peer/temp /" + self.e1.get()+ "/" + nm + ".py" \t \t s = subprocess.Popen(['python3'、 fld])。 e2はWebサーバーファイルの名前、e1は作成されたトップフォルダです。ありがとうMuch – peer

+0

私はs.kill()をどこに置くべきかを見ています。私はTkinterウィンドウにいることを思い出してください...プログラムが終了するまでサーバを稼働させておく必要があります。 – peer

+1

'mainloop()'の後に 's.kill()'を置くことができます。ウィンドウを閉じた後に実行されます。または、ウィンドウを閉じるためのボタンがある場合は、 's.kill()'と 'window.destroy()'を実行する関数を割り当てます。 – furas

1

呼び出されたプログラムの終了コードは、関数os.systemの戻り値であるため、呼び出されたプログラムが終了するまでブロックされます。

ノンブロッキングsubprocess.Popenを代わりに使用してみてください。

+0

したがって、p = self.runServer、subprocess.Popen(p)???道に迷いました。今スレッドの基本を読んでいます。例は非常に貴重です。 – peer