PythonとGTKでTic Tac Toeをプレイする

まえがき



新しいGTK +ブログは初心者向けの記事に満足しているため、C ++ / Cよりも簡単なものを試してみることにしました。 Pythonが役に立ちました。 GTKで作業するためのPythonのコード量はC ++の場合よりもはるかに少なく、これは朗報です。



PyGTK



PyGTKはPython言語用のGTKライブラリのバインディングであり、PyGTKは多くのオープンプログラム(たとえば、IM Gajim)で使用されます。 ライブラリは使いやすく、GTKの実装を完全に隠すため、Pythonプログラマにとって非常に興味深いものになります。



猫の適用例の下。



応用例



PyGTKを学ぶために、簡単な例を作成することにしました-ゲームTic Tac Toeです。

ゲームウィンドウはできる限りシンプルになります-3x3ボタンの正方形。



ゲームウィンドウ:

三目並べゲームウィンドウ



それでは始めましょう。 このプログラムには、XO_FieldとXO_Winの2つのクラスがあります。1つ目はフィールドに関する情報を保存し、2つ目はアプリケーションのGUIを作成し、イベントを処理します。



たとえば、Ubuntuのパッケージマネージャーからインストールされたpygtkモジュールを使用しました。他のシステムではパッケージまたはpython easy-installを使用する価値があり、Windowsの場合はインストーラーがあります。



pygtkモジュールバージョン2.0以降を使用します。

import pygtk pygtk.require('2.0') import gtk
      
      





閉じたらGTKイベントループを中断する簡単なウィンドウを作成しましょう。 destroy関数は少し後に提供されます。

 self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) self.window.connect("destroy", self.destroy) self.window.set_title("-.py!") self.window.set_border_width(10) self.window.set_size_request(400,400)
      
      





ウィンドウには、3行の水平レイアウトと3行の垂直レイアウトを使用します。

そのため、ボタンは3x3の正方形の形で配置されます。 クリックされたイベントハンドラーが各ボタンに追加され、追加構文はQtのシグナルとスロットに非常に似ています。



 self.vbox = gtk.VBox(False,0) self.window.add(self.vbox) for i in range(3): box = gtk.HBox(False,0) self.boxes.append(box) for j in range(3): self.buttons[i].append(self.create_button(box)) self.buttons[i][j].connect("clicked",self.on_btn_click,i,j) self.vbox.pack_start(box,True,True,0) box.show()
      
      





ボタンを作成する関数:

 def create_button(self,box): button = gtk.Button(self.field.chr) box.pack_start(button,True,True,0) button.show() return button
      
      





メインのGTKイベントループを開始し、ウィンドウを破壊します。

 def main(self): gtk.main() def destroy(self, widget, data=None): gtk.main_quit()
      
      





ボタンを押すと、キャラクターが指定された位置に配置され、勝者がまだ決定されていない場合、次のプレイヤーへの移動が転送されます。 ゲームが完了すると、結果がウィンドウタイトルに表示されます。



Tic Tac Toeのゲームとその実装は非常に簡単です。ソースコードへのリンクを以下に示します。 興味深いのは、GTKと組み合わせたPythonアプリケーションのサイクルです。たとえば、UI要素にはリソースへのリンクが多数含まれているため、GTKオブジェクトへのリンクを収集するときのガベージコレクターもデストラクタを呼び出します。



PS

最適な解決策は、GtkTable(グリッド上のウィジェットを整列するためのコンテナー)を3行3列で使用することですが、どういうわけかそれを思い出しました。

コメントに記載されているように、時間が経つにつれてGTK APIは更新され、すでにgtk 3のバインディングがあります。徐々にそれに切り替える価値がありますが、linux以外のプラットフォームでgtk 3をサポートする質問は完全に明確ではありません。



すべてのサンプルソースコード



ソース

  1. WikiのPyGTK
  2. PyGTKプロジェクトサイト
  3. レイアウトとウィジェットについて



All Articles