<p>我想确定按钮是以像素为单位的特定大小的方法是,将该按钮放在帧内,并确保帧设置为特定大小,并且按钮设置为填充该帧。</p>
<p>这可以很容易地转换为在您的程序中工作,并确保按钮设置为100 x 100。</p>
<p>这是我知道的唯一确定按钮像素大小的方法。可能还有其他选择。</p>
<p>首先我们需要两份清单。一个用来固定框架,一个用来固定按钮。这将使我们能够以一种简单的方式存储框架和按钮,我们可以稍后使用。</p>
<pre><code>frames_list = []
btn_list = []
</code></pre>
<p>我不知道如何压缩您的<code>check_win()</code>函数,所以我只对它做一个小的更改,这样它就可以处理列表了。我们需要用按钮列表中的对应项替换<code>a1</code>、<code>a2</code>、<code>a3</code>等的每个实例,替换为稍后将用for循环创建的索引值。</p>
<pre><code>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()
</code></pre>
<p>然后,我们需要更改<code>process_turn()</code>函数,使其包含按钮列表中每个按钮的索引值,以便像这样向其添加一个参数。</p>
<pre><code>def process_turn(ndex): # index argument being sent by buttons
btn_list[ndex].config(text=turn) # changed text at index of list.
check_win()
</code></pre>
<p>最后,我们需要在命令中创建具有正确索引的所有按钮,我们可以使用for循环来完成这项工作。2号井用于循环。</p>
<p>第一个循环将开始行计数,第二个for循环将开始列计数。这将创建我们的3×3网格。变量<code>ndex</code>用于跟踪每个按钮需要在按钮列表上配置的索引。</p>
<pre><code>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()
</code></pre>
<p>总而言之,这段代码的大小正好是您想要的100x100像素。</p>
<p>请看下面的示例:</p>
<pre><code>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()
</code></pre>
<p>结果:</p>
<p><a href="https://i.stack.imgur.com/XU1q1.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/XU1q1.png" alt="enter image description here"/></a></p>