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. レイアウトとウィジェットについて

Source: https://habr.com/ru/post/J135833/


All Articles