レむアりトずりィゞェットに぀いおもう少し

これは、 PyGTKに関する䞀連の蚘事の続きです。

前の蚘事では、PyGTKアプリケヌションを開発するためにWindowsずUbuntuを準備し、Gladeむンタヌフェむス゚ディタヌで䜜業し、氎平および垂盎レむアりトタむプを調べ、スクロヌルペむンずテキスト゚ディタヌ、ボタン、ボタン、および小さな信号の垂盎グルヌプを䜿甚したした。 その結果、UbuntuずWindowsで正垞に機胜する最初の真のクロスプラットフォヌムアプリケヌションを手に入れたした。 前の蚘事をただ読んでいない堎合は、 それから始めるこずをお勧めしたす。

この蚘事では、簡単なゲヌムを䜜成し、その過皋でレむアりトに぀いおもう少し孊び、PyGTKりィゞェットに粟通し続け、ダむアログを操䜜したす。

アむデア、脚本


たず第䞀に、私たちが䜕をするかに぀いおお話したいず思いたす。 ゲヌムになりたす。 ゲヌムはシンプルで楜しいものでなければなりたせん。 私に起こった最も簡単なこずは䞉目䞊べでした。 ゲヌムには察戊盞手のキャラクタヌが必芁です。 私が知っおいる最もクヌルなキャラクタヌはベンダヌです。 そのため、ベンダヌを敵ずしお䞉目䞊べを䜜成したす。

りィキペディアでゲヌムのアルゎリズムを䜿甚しおください。非垞にシンプルでわかりやすく説明されおいたす。 私たちはPyGTKをマスタヌしおいるので、メむントピックから耇雑なアルゎリズムを取り陀いおください。 アルゎリズムに぀いお詳しく知りたい堎合は、 Donald Knuthをご芧ください。

シナリオは次のずおりです。プレヌダヌはクロスを配眮し、ベンダヌはれロで応答したす。 ゲヌムの終わりに、勝者にお祝いの蚀葉が衚瀺され、その埌ゲヌムが再開されたす。

すぐに、䜿いやすさの芳点から、メむンりィンドりに重なるダむアログが䜿甚されるため、ゲヌムが非垞に悪いこずに泚意しおください。 良いニュヌスは、ダむアログに粟通し、任意のりィンドりからモヌダルダむアログを䜜成できるこずです。

Inkscapeのむンタヌフェヌスをスケッチしたしょう


むンタヌフェヌスファむルを䜜成するには、Gladeむンタヌフェヌス゚ディタヌを䜿甚したす。 Gladeを実行しおください。 䜕が危険なのかわからない堎合は、 前の蚘事を読んでください。

テヌブルレむアりト


テヌブルレむアりトは、倚数のりィゞェットを配眮する堎合に非垞に䟿利です。これは私たちの堎合です。

スケッチから、䞉目䞊べに3本の線が必芁であり、ボタンを䞊䞋に配眮するのに1本の線が必芁であるこずがわかりたす。
新しいりィンドりを䜜成する

すぐに衚瀺したすこれがプログラムのメむンりィンドりになりたす。

テヌブルレむアりトを远加したす

5行3列で
。
テヌブルのセルが正方圢になるようにりィンドりをスケヌリングし、最終結果を想像しやすくしたした
。

2぀のボタンを远加したす。 テヌブルの最初のセルにボタンを配眮したす。
。
ご芧のずおり、ボタンはセル党䜓を占めおいたした。 この機胜を䜿甚しお競技堎を描画できたすが、実行したせん。ここでは、この動䜜も必芁ないため、プロパティの[パッケヌゞ]タブに切り替えたす。 「垂盎オプション」で「フィル」のチェックを倖したす
。
したがっお、ボタンは利甚可胜なすべおのスペヌスを高さで埋めるべきではないこずを瀺したす
。
気づいたら、衚のセルの幅は同じではありたせん。 これにより、同じセルで競技堎を䜜成できなくなりたす。 したがっお、table1を遞択し、䞻なプロパティで「均質性」を「はい」に倉曎したす
、
セルの幅は同じになりたした。

スケッチでは、䞊郚ず䞋郚のボタンが氎平方向のスペヌス党䜓を占有し、䞊郚のボタンは1぀のセルのみを占有したす。 幅が3぀のセルを占めるこずが必芁です。 ボタンを遞択し、プロパティ「パッケヌゞング」、「右偎に远加」、

倀を3に増やしたす。 ボタンの幅は3セルです
。

アむコンボタン


「New game」ボタンず「Quit the game」ボタンにテキストだけでなくアむコンも含めるようにしたす。 これは非垞に簡単です。 メむンプロパティで、[タむプの線集]を[コンテナ]に倉曎したす。
。
これで、ボタンの衚面のコンテナに䜕でも配眮できたす。

アむコン付きのテキストを配眮する最も簡単で最も正しい方法は、別のレむアりトツヌルを䜿甚するこずです。 「アラむメント」ボタンに远加したす
、
䞻なプロパティで、垂盎および氎平スケヌリングをれロに蚭定したす
、
したがっお、アラむンメントは、利甚可胜なすべおのスペヌスを「キャプチャ」したせんが、必芁最小限に制限されたす。 これが必芁なのは、アむコンがテキストから離れないようにするためです。

配眮内には、1぀の芁玠だけのスペヌスがあり、2぀配眮する必芁がありたす。 2぀のセルを持぀氎平レむアりトを䜿甚し、配眮に配眮したす
。
巊のセルにアむコンを配眮したす
、
右偎-「New Game」ずいうテキストの付いたテキストラベル
、
。

アむコンを怜玢しお描画しないために、埌でプログラムが起動したずきにアむコンをロヌドしないように、既補のGTKアむコンを䜿甚したす。 メむンプロパティの[䜜成]アむコンを遞択したす
。

アむコンがマヌクに近すぎたす。 これは、氎平レむアりトのギャップサむズを蚭定するか、アむコン自䜓のピクセル単䜍でパディングを蚭定するこずで修正できたす。 アむコンに4ピクセルのパディングを蚭定したす
。
結果は次のようになりたす。
。

䞋郚の[ゲヌムを終了]ボタンに぀いおも同じ操䜜を行いたす。 このようなものでなければなりたせん
、
閉じるアむコンを䜿甚したした。

むンタヌフェむスをgui.gladeファむルに保存するず、ゲヌムの開始時にプログラムによっおプレむフィヌルドが䜜成されたす。

競技堎


それらの機胜をよりよく研究するために、テキストラベルに基づいお競技堎を構築したす。

9぀のラベルがあり、Gladeでそれぞれ個別に䜜業するこずは意味がありたせん。これは数行のコヌドでこれを行うこずができるためです。 さらに、すべおのラベルのプロパティを䞀床に倉曎する機䌚がありたすが、これは間違いなく必芁です。

空癜のプログラムを䜜成したしょう
 / usr / bin / env python
 コヌディングutf-8
むンポヌトシステム
茞入OS
 pygtkをむンポヌトする
 pygtk.require '2.0'
むンポヌトgtk
むンポヌトgtk.glade
        
クラスアプリ

     def __init __self
         むンタヌフェヌスファむルをダりンロヌドする
         self.gladefile = "gui.glade"
         むンタヌフェヌス芁玠のツリヌ
         self.widgetsTree = gtk.glade.XMLself.gladefile
         衚        
         self.table1 = self.widgetsTree.get_widget "table1"       
         競技堎を初期化する   
         self.init_board
         りィンドりを閉じるむベントをアプリケヌション終了関数に接続したす
         self.window = self.widgetsTree.get_widget "window1"
         ifself.window
             self.window.connect "destroy"、self.close_app
           
     def close_appself、widget    
         gtk.main_quit        
    
 __name__ == "__main__"の堎合
     app = App
     gtk.main

ゲヌムフィヌルドはself.init_boardで䜜成されたす。
     def init_boardself
         競技堎の蟞曞保管ラベル
         self.board_widgets = {}
         1〜3行目にラベルを远加したす
        範囲0.3の行の堎合
             ストレヌゞ行を初期化し、空の蟞曞を䜜成
             テヌブルセルの内容を保存する
             self.board_widgets [行] = {}
             列0から2を通過
            範囲0,3の列の堎合
                 ラベルを䜜成したす。そのテキストには行ず列の番号が含たれたす
                 self.board_widgets [行] [列] = \
                                 gtk.Label "label_d_d"列、行
                 ラベルをテヌブルに添付
                 self.table1.attachself.board_widgets [行] [列]、 
                                   列、列+ 1
                                   行+ 1、行+ 2
                 ラベルを衚瀺する
                 self.board_widgets [行] [列] .show

競技堎は、蟞曞に基づいお䜜成された「2次元配列」に保存されたす。 ラベルコンストラクタヌgtk.Labelは、ラベルが衚瀺するテキストを枡したす。 アタッチテヌブルメ゜ッドは、りィゞェットを最初のパラメヌタヌ、この堎合はラベルずしお䜿甚したす。 2番目はラベルの巊偎が添付される列番号、3番目はラベルの右偎が添付される列番号です。 ぀たり、最初の列にラベルを配眮するには、2番目ず3番目のパラメヌタヌが0ず1である必芁がありたす。 ドキュメントのすべおのパラメヌタの説明を読むこずができたす 。

プログラムを起動するず、次のようなりィンドりが衚瀺されるはずです。
。

むベント゚リア、フレヌム


プログラムを埩掻させる時が来たした。䞋のボタンを機胜させ、マりスの巊ボタンをクリックするためのハンドラヌを各ラベルに远加したす。 Gladeを開いお、ボタンにクリックハンドラヌを远加したす。 ボタンを遞択し、プロパティの「信号」タブに移動しお、クリックした信号にハンドラヌを割り圓おたす
。
倉曎を保存し、コヌド線集に戻りたす。 次の行を__init__に远加したす。
         ハンドラヌ関数ずむベントの関連付けを指定する語圙
         dic = {                 
                 「button2_clicked_cb」self.close_app、
             }
         シグナルをハンドラヌに接続するマゞックコマンド
         self.widgetsTree.signal_autoconnectdic

コヌドを保存したす。 䞋のボタンをクリックするず、プログラムが閉じるかどうかを確認できたす。

各ラベルには、マりスクリックむベントハンドラヌbutton-press-eventも必芁です。 ただし、今すぐ远加しおプログラムを実行し、機胜するかどうかを確認しおから、機胜しないこずを確認しおください。 ラベルには独自のりィンドりがないため、このようなむベントを凊理するこずはできたせん。 独自のりィンドりを持たないすべおのりィゞェットは、このリストにリストされおいたす 。

この制限を克服するには、特別なタむプのレむアりト-むベント゚リアを䜿甚する必芁がありたす。 Gladeパレットでは、このように芋えたす
。
次のように機胜したす。むベント゚リアはりィンドりに配眮され、ラベルはむベント゚リアに配眮されたす。 むベントハンドラヌは、むベントペむンに割り圓おられたす。 その結果、必芁なすべおのむベントがむンタヌセプトされたす。

これをself.init_boardに反映するず同時に、むベント゚リアのむベントハンドラヌを远加する必芁がありたす。
     def init_boardself
         競技堎の蟞曞保管ラベル
         self.board_widgets = {}
         1〜3行目にラベルを远加したす
        範囲0.3の行の堎合
             ストレヌゞ行を初期化し、空の蟞曞を䜜成
             テヌブルセルの内容を保存する
             self.board_widgets [行] = {}
             列0から2を通過
            範囲0,3の列の堎合
                 むベント゚リアを䜜成
                 event_box = gtk.EventBox
                 ラベルを䜜成したす。そのテキストには行ず列の番号が含たれたす
                 label = gtk.Label "label_d_d"列、行
                 ラベルを衚瀺する
                 label.show
                 むベント゚リアにラベルを貌る
                 event_box.addラベル
                 ゚リアのむベントハンドラヌを定矩する
                 event_box.connect "button_press_event"、self.label_clicked、行、列
                 この経枈をすべおストレヌゞに曞き蟌む
                 self.board_widgets [行] [列] = event_box                
                 ラベル付きのむベント゚リアをテヌブルに添付
                 self.table1.attachself.board_widgets [行] [列]、 
                                   列、列+ 1
                                   行+ 1、行+ 2
                 ラベルが衚瀺されたむベント゚リアを䜜成する
                 self.board_widgets [行] [列] .show    

     def label_clicked自己、りィゞェット、むベント、行、列
         print "columns、rows"列、行

接続関数では、信号ずりィゞェットに加えお、行ず列ずいう2぀の远加パラメヌタヌも指定したす。 これらのパラメヌタヌはlabel_clickedで読み取られ、ゲヌムの制埡に䜿甚されたす。 むベント゚リアずラベルの䞡方をshowを䜿甚しお衚瀺する必芁がありたす。 プログラムを実行しおラベルをクリックするず、コン゜ヌルで、ラベルが配眮されおいるテヌブルの列ず行の出力の圢匏で反応が衚瀺されたす。

むンタヌフェむスはほずんど準備ができおいたすが、セルに線のマヌクを付けずにプレむするのは䞍䟿です。 ラベルにフレヌムを远加する必芁がありたす。 GTKには、フレヌムを衚瀺する特別なりィゞェットコンテナヌがありたす。 Gladeでは、「フレヌム」ず呌ばれたす
。

むベント領域がフレヌム内に収たるようにコヌドを倉曎する必芁がありたす。 同時に、ラベル䞊のテキストの出力を削陀したす。これはもう必芁ありたせん。
     def init_boardself
         競技堎の蟞曞保管ラベル
         self.board_widgets = {}
         1〜3行目にラベルを远加したす
        範囲0.3の行の堎合
             ストレヌゞ行を初期化し、空の蟞曞を䜜成
             テヌブルセルの内容を保存する
             self.board_widgets [行] = {}
             列0から2を通過
            範囲0,3の列の堎合
                 フレヌムを䜜成
                フレヌム= gtk.Frame
                 frame.set_shadow_typegtk.SHADOW_ETCHED_IN
                 むベント゚リアを䜜成
                 event_box = gtk.EventBox
                 ラベルを䜜成
                ラベル= gtk.Label
                 ラベルを衚瀺する
                 label.show
                 むベント゚リアにラベルを貌る
                 event_box.addラベル
                 ゚リアのむベントハンドラヌを定矩する
                 event_box.connect "button_press_event"、self.label_clicked、行、列
                 event_box.show
                 frame.addevent_box
                 この経枈をすべおストレヌゞに曞き蟌む
                 self.board_widgets [行] [列] =フレヌム                
                 ラベル付きのむベント゚リアをテヌブルに添付
                 self.table1.attachself.board_widgets [行] [列]、 
                                   列、列+ 1
                                   行+ 1、行+ 2
                 ラベルが衚瀺されたむベント゚リアを䜜成する
                 self.board_widgets [行] [列] .show

そのような窓が刀明


ラベル䞊の曞匏付きテキスト出力


タグはフォヌマットされたテキストを衚瀺できたす。 特定のフォント、サむズ、スタむル、色でテキストを衚瀺できたす。 init_boardに数行远加したす
                 ラベル埌= gtk.Label
                 label.set_use_markupTrue
                 label.set_markup "<span font_desc = 'Arial 64'> X </ span>"

プログラムを実行したす。
。

察話



Gladeには、ほずんどすべおの機䌚にダむアログがありたす。 任意のりィンドりに基づいおモヌダルダむアログを䜜成する方法を玹介したす。

新しいりィンドりを䜜成し、そのプロパティに移動したす。


矢印は、りィンドりのモダリティず関連するりィンドりずいう2぀の重芁なプロパティを匷調しおいたす。 モダリティに泚目すべき理由は明らかだず思いたす-モヌダルな察話を行っおいたす。 「リンクりィンドり」プロパティは、これがモヌダルダむアログになるメむンりィンドりを瀺したす。

既知のりィゞェットずレむアりトを䜿甚しお、このダむアログをスケッチしたした。

りィゞェットツリヌ


すべおが非垞に簡単です。むメヌゞに぀いおは、ファむルが゜ヌスずしお指定されおいるこずに泚意しおください。


むンタヌフェむスを保存し、コヌド゚ディタヌに戻りたす。

最初に行うこずは、削陀むベントダむアログりィンドりむベントのハンドラヌを蚭定するこずです。 これが行われない堎合、りィンドりタむトルのXボタンを䜿甚しおダむアログを閉じた埌たたはりィンドりマネヌゞャヌを䜿甚しお他の方法で、このりィンドりのすべおのりィゞェットが「消滅」したす。 次回このりィンドりを開くず、埮芖的になり、完党に空になりたす。 __init__に远加したす
         self.winner_dialog = self.widgetsTree.get_widget "window2"        
         self.winner_dialog.connect "delete-event"、self.on_delete_event

on_delete_eventメ゜ッドは、むベントがさらに凊理されないようにTrueを返す必芁がありたす。

䞀般に、ほずんどすべおの準備が敎ったので、メ゜ッドコヌドは興味深いものになり、ゲヌムの勝者が衚瀺されたす。
     def show_winnerself
         self.game.and_the_winner_is== -1の堎合
             self.widgetsTree.get_widget "image3"。set_from_file '1.png'
             self.widgetsTree.get_widget "label3"。set_markup 
                         "<span font_desc = 'Arial 18'>さお、あなたは私よりも賢いずいうこずを理解しおいたすか</ span>"
             self.widgetsTree.get_widget "label4"。set_text "はい、ワヌムですので認めおいたす。"
             self.widgetsTree.get_widget "label5"。set_text
                          「あなたはただの\ n猶、ベンダヌ、\ nandだ、今それを蚌明したす」        
        その他
             self.widgetsTree.get_widget "image3"。set_from_file '2.png'
             self.widgetsTree.get_widget "label3"。set_markup 
                         "<span font_desc = 'Arial 18'>男はロボットに負けなければなりたせん</ span>"
             self.widgetsTree.get_widget "label4"。set_text "はい、ちょうど幞運です。"
             self.widgetsTree.get_widget "label5"。set_text "あなたは少数ですかさお、ちょっず埅っおください"
         self.winner_dialog.show

set_from_fileメ゜ッドを䜿甚しお画像ファむルを指定したす。ラベルのset_markupはマヌクアップを瀺し、self.winner_dialog.showはダむアログを開きたす。

Windowsでゲヌムを実行するために残りたす

およびLinux

意図したずおり、すべおが䞡方のOSで動䜜したす

アルゎリズムは、プレヌダヌが匱い堎合子䟛など、偶然に動きたす。そのため、勝぀チャンスがあり、ベンダヌは負けたす。
今こそゲヌムをダりンロヌドし、ベンダヌで遊ぶ時間です。

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


All Articles