2017-09-16 3 views
0

少し前に、Python(2.7)で単純なTic-tac-toeゲームを書きました。クライアントスクリプト。今私はgtkでクライアントを拡張したいと思います。私はこれをデコレータの使用の例にしたいと思います。クライアントスクリプトは、プロンプトを介してデータを取得するように動作します。私はスクリプトを書いて、クライアント用のパッチ(クライアント関数をデコレートし、new gtk-clientスクリプトとwallahを呼び出す)のようなものを作成したいと思っています。私はそのように行うことを考えた:Tic-tac-toeゲームの機能を拡張する(gtk + decorators + raw_input)

  • のgtk-クライアントは、スレッド内のクライアントスクリプトからrun_game()関数を起動するユーザの入力を担当する
  • 機能は、コードを実行し、最後に、彼らは迅速にデータを置くこと、デコレータを持っています(?それは可能である)

これはGTKインターフェイスでクライアントスクリプトを制御することが私の考えですが、私はいくつかの問題に出くわした:

  • はkeyboように促すためのデータを配置することが可能ですARDの入力?
  • raw_input()がメインスレッドにない場合、データを取得することは可能ですか?

編集: [OK]を、私は解決策を見つけました。私はraw_input()関数(猿のパス)を上書きするデコレータを作成します。これは次のようになります:

  • gtk-clientはrun_game()funcでスレッドを作成します。クライアント
  • run_game()(関数呼び出しの前に)上書きraw_input()飾られている
  • 今raw_input()からのキュー(queue.get())でのgtk-クライアントからの入力データを待ち

それ良い解決策のように見えるが、ここに私の別の問題がある。私のgtk-clientはスレッド(run_game())を呼び出します。 thread.join()を使用しないと、スレッドが実行中にブロックされたり、印刷機能がデータ全体をコンソールに出力できません。スレッドがキュー内のデータを待つため、私は競合を作成するthread.join()を使用します。例のテストコード:この場合、私のスレッドのみ印刷 'スレッドの開始' は、

gtk-client.py

import gtk 
import client as cliApp 
from threading import Thread 
from Queue import Queue 

# gtk stuff etc... 

# lets say it is called on y_button_click, part of GameGtk class 
def y_button_click(self, widget): 
    cliApp.q.put('test msg') 


# lets say that it is called in x_button_click 
@run_game_decorator(func): 
    def wrapper(*args): 
     # some connecting/logging stuff 
     cliApp.q = Queue() 
     t = Thread(target = cliApp.test) 
     t.start() 
     # t.join() - worked until I added q.get() to new raw_input() 
    return wrapper 
# gtk still working after this function 

client.py

def new_raw_input(label): 
    print label 
    return q.get() 

def test(): 
    print 'Thread start' 
    raw_input = new_raw_input 
    a = raw_input("Type something: ") 
    print a 
    print 'Thread finished' 

。この問題をどのように処理するのですか?

+0

私があなたの質問を正しく理解していれば、あなたの要求は可能です。しかし、それは価格が付属しています。あなた自身のGUIループからすべてのGtkウィジェットをコントロールする価格。 Linux Mintはいくつかのダイアログでこれを行い、コードはすばやく複雑になります。 – theGtknerd

答えて

0

最後に、すべての私の問題を解決しました。 raw_input()へのユーザ入力をシミュレートするには、問題の編集セクションを参照して、関数funcionality(monkey patching)を変更するだけです。

コンソールでの印刷エラーについて - 私は、バッファをフラッシュするためにsys.stdout.flush()を追加して(here)、キューにデータを入れた後にスレッドを待って解決します。

gtk-client。py

import gtk 
import client as cliApp 
from threading import Thread 
from Queue import Queue 
from time import sleep 
import sys 


# gtk stuff etc... 

# lets say it is called on y_button_click, part of GameGtk class 
def y_button_click(self, widget): 
    cliApp.q.put('test msg') 
    self.t.join() 


# lets say that it is called in x_button_click 
@run_game_decorator(func): 
    def wrapper(*args): 
     # some connecting/logging stuff 
     cliApp.q = Queue() 
     gtkWindow.t = Thread(target = cliApp.test) 
     gtkWindow.t.start() 
     sleep(0.1) 
     sys.stdout.flusch() 
    return wrapper 
# gtk still working after this function 
関連する問題