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