方法は、フレームの内側にそのボタンを配置し、フレームが特定のサイズに設定され、ボタンはその枠を埋めるために設定されていることを確認することによってです。
これは、簡単にあなたのプログラムで動作するように変換することができ、それは確かボタンが正確に100×100
これは私がボタンのサイズを確認するのを認識しています唯一の方法であるに設定されていますピクセル単位。他にもオプションがあります。
まず、2つのリストが必要です。 1つはフレームを保持し、もう1つはボタンを保持する。これにより、フレームとボタンを簡単に保存して、後で作業することができます。
frames_list = []
btn_list = []
私はそれがリストで動作しますので、私はそれに若干の変更を行いますので、あなたのcheck_win()
機能を凝縮する方法についての私の頭の上から確認していません。私たちは、後にforループを使用して作成されようとしているインデックス値を持つボタンのリストでその相手とそうでa1
、a2
、a3
の各インスタンスを交換する必要がある、と。
def check_win():
# Horizontal wins
if btn_list[0]["text"] == btn_list[1]["text"] == btn_list[2]["text"] == "X" or btn_list[0]["text"] == btn_list[1]["text"] == btn_list[2]["text"] == "O":
print("{} wins".format(btn_list[0]["text"]))
elif btn_list[3]["text"] == btn_list[4]["text"] == btn_list[5]["text"] == "X" or btn_list[3]["text"] == btn_list[4]["text"] == btn_list[5]["text"] == "O":
print("{} wins".format(btn_list[3]["text"]))
elif btn_list[6]["text"] == btn_list[7]["text"] == btn_list[8]["text"] == "X" or btn_list[6]["text"] == btn_list[7]["text"] == btn_list[8]["text"] == "O":
print("{} wins".format(btn_list[6]["text"]))
# Vertical wins
elif btn_list[0]["text"] == btn_list[3]["text"] == btn_list[6]["text"] == "X" or btn_list[0]["text"] == btn_list[3]["text"] == btn_list[6]["text"] == "O":
print("{} wins".format(btn_list[0]["text"]))
elif btn_list[1]["text"] == btn_list[4]["text"] == btn_list[7]["text"] == "X" or btn_list[1]["text"] == btn_list[4]["text"] == btn_list[7]["text"] == "O":
print("{} wins".format(btn_list[1]["text"]))
elif btn_list[2]["text"] == btn_list[5]["text"] == btn_list[8]["text"] == "X" or btn_list[2]["text"] == btn_list[5]["text"] == btn_list[8]["text"] == "O":
print("{} wins".format(btn_list[2]["text"]))
# Diagonal wins
elif btn_list[0]["text"] == btn_list[4]["text"] == btn_list[8]["text"] == "X" or btn_list[0]["text"] == btn_list[4]["text"] == btn_list[8]["text"] == "O":
print("{} wins".format(btn_list[0]["text"]))
elif btn_list[2]["text"] == btn_list[4]["text"] == btn_list[6]["text"] == "X" or btn_list[2]["text"] == btn_list[4]["text"] == btn_list[6]["text"] == "O":
print("{} wins".format(btn_list[2]["text"]))
# If no one wins
else:
change_turn()
その後、我々はボタン、リスト内の各ボタンのインデックス値を含めるので、このようにそれに引数を追加するprocess_turn()
機能を変更する必要があります。
def process_turn(ndex): # index argument being sent by buttons
btn_list[ndex].config(text=turn) # changed text at index of list.
check_win()
最後に、我々は、コマンドに正しいインデックスを持つすべてのボタンを作成する必要があり、我々はのためのループでこれを行うことができます。まあ、2つのループです。
最初のループは行カウントを開始し、2番目のforループは列カウントを処理します。これにより、3×3グリッドが作成されます。 ndex
変数は、各ボタンがボタンリストで設定する必要があるインデックスを追跡するために使用されます。
def create_frames_and_buttons():
ndex = 0
i = 0
x = 0
for i in range(3):
for x in range(3):
frames_list.append(Frame(root, width = 100, height = 100))
frames_list[ndex].propagate(False)
frames_list[ndex].grid(row = i, column = x, sticky = "nsew", padx = 2, pady = 2) # add any padding you would like to space out the frames/buttons
btn_list.append(Button(frames_list[ndex], text="", font="Helvetica 16 bold",
command = lambda ndex=ndex: process_turn(ndex)))
btn_list[ndex].pack(expand=True, fill=BOTH)
x += 1
ndex += 1
i += 1
root.resizable(width=False, height=False)
create_frames_and_buttons()
あなたが望む正確な100x100ピクセルサイジングを持つこのコードをまとめています。
は、以下の例を見てみましょう:
from tkinter import *
root = Tk()
frames_list = []
btn_list = []
turn = "X"
turnLabel = Label(root, text=turn, font="Helvetica 16 bold")
turnLabel.grid(row=3, columnspan=3)
def change_turn():
global turn
if turn == "O":
turn = "X"
turnLabel.config(text=turn)
elif turn == "X":
turn = "O"
turnLabel.config(text=turn)
def check_win():
# Horizontal wins
if btn_list[0]["text"] == btn_list[1]["text"] == btn_list[2]["text"] == "X" or btn_list[0]["text"] == btn_list[1]["text"] == btn_list[2]["text"] == "O":
print("{} wins".format(btn_list[0]["text"]))
elif btn_list[3]["text"] == btn_list[4]["text"] == btn_list[5]["text"] == "X" or btn_list[3]["text"] == btn_list[4]["text"] == btn_list[5]["text"] == "O":
print("{} wins".format(btn_list[3]["text"]))
elif btn_list[6]["text"] == btn_list[7]["text"] == btn_list[8]["text"] == "X" or btn_list[6]["text"] == btn_list[7]["text"] == btn_list[8]["text"] == "O":
print("{} wins".format(btn_list[6]["text"]))
# Vertical wins
elif btn_list[0]["text"] == btn_list[3]["text"] == btn_list[6]["text"] == "X" or btn_list[0]["text"] == btn_list[3]["text"] == btn_list[6]["text"] == "O":
print("{} wins".format(btn_list[0]["text"]))
elif btn_list[1]["text"] == btn_list[4]["text"] == btn_list[7]["text"] == "X" or btn_list[1]["text"] == btn_list[4]["text"] == btn_list[7]["text"] == "O":
print("{} wins".format(btn_list[1]["text"]))
elif btn_list[2]["text"] == btn_list[5]["text"] == btn_list[8]["text"] == "X" or btn_list[2]["text"] == btn_list[5]["text"] == btn_list[8]["text"] == "O":
print("{} wins".format(btn_list[2]["text"]))
# Diagonal wins
elif btn_list[0]["text"] == btn_list[4]["text"] == btn_list[8]["text"] == "X" or btn_list[0]["text"] == btn_list[4]["text"] == btn_list[8]["text"] == "O":
print("{} wins".format(btn_list[0]["text"]))
elif btn_list[2]["text"] == btn_list[4]["text"] == btn_list[6]["text"] == "X" or btn_list[2]["text"] == btn_list[4]["text"] == btn_list[6]["text"] == "O":
print("{} wins".format(btn_list[2]["text"]))
# If no one wins
else:
change_turn()
def process_turn(ndex):
btn_list[ndex].config(text=turn)
check_win()
def create_frames_and_buttons():
ndex = 0
i = 0
x = 0
for i in range(3):
for x in range(3):
frames_list.append(Frame(root, width = 100, height = 100))
frames_list[ndex].propagate(False)
frames_list[ndex].grid(row = i, column = x, sticky = "nsew", padx = 2, pady = 2)
btn_list.append(Button(frames_list[ndex], text="", font="Helvetica 16 bold",
command = lambda ndex=ndex: process_turn(ndex)))
btn_list[ndex].pack(expand=True, fill=BOTH)
x += 1
ndex += 1
i += 1
root.resizable(width=False, height=False)
create_frames_and_buttons()
root.mainloop()
結果:
は、あなたが質問に記述するコードが掲載コードと一致しない(その多くは、質問に関連しないよう求めています)。 –
このコードを[mcve]に減らしてください。たとえば、問題がウィジェットのサイズに関連している場合、すべてのコールバックは必要ありません。 –
@ScottHunter不要なコードを削除する質問を編集しました。希望があれば –