2016-06-19 16 views
1

私はTicTacToeプログラムを実装しようとしています。私はPythonの初心者です。多くのチュートリアルを見て、いくつかの本を読んだ後、私はPythonの基礎を理解しています。私はフレームに表示するボタンを取得しようとしているが、私が得るのは空白のウィンドウです。Tkinter:フレーム内のボタンが表示されない

link for image of the resultant window

これは、これまで私が持っているコードです:

from Tkinter import * 

class Buttons(object): 

    def __init__(self,master): 
     frame = Frame(master) 
     frame.pack() 

     self.button1= Button(frame,text="1",height=4,width=8,command=self.move) 
     self.button1.pack(side=LEFT) 

     self.button2= Button(frame,text="2",height=4,width=8,command=self.move) 
     self.button2.pack(side=LEFT) 

     self.button3= Button(frame,text="3",height=4,width=8,command=self.move) 
     self.button3.pack(side=LEFT) 


root = Tk() 
root=mainloop() 
+0

わかりました。私は問題を理解しました。これは、b = Buttons(ルート)を動作させるために必要でした。なぜこれが必要なのか説明すると役に立つでしょうか?ありがとうございました。 –

+0

さて、私は数分で回答を投稿します。 –

答えて

2

Buttonsクラスを定義しましたが、そのクラスのインスタンスを作成していないため、実際にボタンが作成されませんでした。また、あなたはタイプミス/構文エラーがあった:

root=mainloop() 

はまた

root.mainloop() 

する必要があり、あなたはmoveコールバックメソッドを定義していませんでした。

はここにあなたのコードの修理版です:

from Tkinter import * 

class Buttons(object): 

    def __init__(self,master): 
     frame = Frame(master) 
     frame.pack() 

     self.button1 = Button(frame, text="1", height=4, width=8, command=self.move) 
     self.button1.pack(side=LEFT) 

     self.button2 = Button(frame, text="2", height=4, width=8, command=self.move) 
     self.button2.pack(side=LEFT) 

     self.button3 = Button(frame, text="3", height=4, width=8, command=self.move) 
     self.button3.pack(side=LEFT) 

    def move(self): 
     print "click!" 

root = Tk() 
Buttons(root) 
root.mainloop() 

はしかし、これはまだ問題があります。move方法は、それを呼び出したボタン知る方法はありません。これを修正する方法が1つあります。私はまた、それは「スター」の輸入を使うのは良い考えではありません

import tkinter as tk 

from Tkinter import * 

を変更しました。コードを読みにくくして、インポートされたモジュール(Tkinterの場合は175の名前)に定義されているすべての名前で名前空間を汚染し、名前の衝突を招きます。

import Tkinter as tk 

class Buttons(object): 

    def __init__(self,master): 
     frame = tk.Frame(master) 
     frame.pack() 

     self.buttons = [] 
     for i in range(1, 4): 
      button = tk.Button(
       frame, text=i, height=4, width=8, 
       command=lambda n=i:self.move(n) 
      ) 
      button.pack(side=tk.LEFT) 
      self.buttons.append(button) 

    def move(self, n): 
     print "click", n 

root = tk.Tk() 
Buttons(root) 
root.mainloop() 
+0

この投稿には本当にありがとうございます!それは非常に有益です! –

+0

@ms:私の喜び!あなたのプログラムに幸運。おそらく、 '.pack'の代わりに' .grid'メソッドを使ってチック・タック・トゥ・グリッドを作るほうが簡単でしょう。 –

+0

はい、私はすでにそれをしています。私はゲームの部分を実装し始めるとかなりの衝撃に直面することは間違いない。うまくいけば、SOはそれを通って私を助けます:Dもう一度感謝! –

0

オーケー問題は、私は、コードの末尾に変数を追加するのに必要でした。 b =ボタン(ルート)のようなもの。それは今働いている。

関連する問題