我创建了代码,以便为我正在开发的Tic-Tac-Toe程序显示3x3的按钮网格。网格以前工作过,但是当我尝试将代码放入类时,当我尝试运行该程序时,我只会得到一个空白屏幕。这是我的代码:
from tkinter import *
buttons = {".!frame.!button": 0,
".!frame.!button2": 1,
".!frame.!button3": 2,
".!frame.!button4": 3,
".!frame.!button5": 4,
".!frame.!button6": 5,
".!frame.!button7": 6,
".!frame.!button8": 7,
".!frame.!button9": 8,
}
class GameBoard:
def __init__(self, master):
self.field = Frame(master)
self.field.grid
self.b1 = Button(self.field, text="-")
self.b1.bind("<Button-1>", self.setfield)
self.b1.grid(row=0, column=0)
self.b2 = Button(self.field, text="-")
self.b2.bind("<Button-1>", self.setfield)
self.b2.grid(row=0, column=1)
self.b3 = Button(self.field, text="-")
self.b3.bind("<Button-1>", self.setfield)
self.b3.grid(row=0, column=2)
self.b4 = Button(self.field, text="-")
self.b4.bind("<Button-1>", self.setfield)
self.b4.grid(row=1, column=0)
self.b5 = Button(self.field, text="-")
self.b5.bind("<Button-1>", self.setfield)
self.b5.grid(row=1, column=1)
self.b6 = Button(self.field, text="-")
self.b6.bind("<Button-1>", self.setfield)
self.b6.grid(row=1, column=2)
self.b7 = Button(self.field, text="-")
self.b7.bind("<Button-1>", self.setfield)
self.b7.grid(row=2, column=0)
self.b8 = Button(self.field, text="-")
self.b8.bind("<Button-1>", self.setfield)
self.b8.grid(row=2, column=1)
self.b9 = Button(self.field, text="-")
self.b9.bind("<Button-1>", self.setfield)
self.b9.grid(row=2, column=2)
def setfield(self, event):
print(buttons[str(event.widget)])
root = Tk()
board = GameBoard(root)
root.mainloop()
有人可以帮我找出为什么我在运行程序时只会得到一个空白框吗?
答案 0 :(得分:1)
有人可以帮我找出为什么我在运行程序时只会得到一个空白框吗?
这是因为您没有将其添加到窗口中。考虑以下代码:
self.field.grid
它绝对不执行任何操作。要显示该窗口,您必须调用该函数:
self.field.grid()
我认为,一个类永远不要自己调用grid
或pack
或place
。那应该是呼叫者的工作。这是一个好习惯,因为它可以促进代码重用。
我个人将删除该行,并将最后几行更改为此:
board = GameBoard(root)
board.grid() # or board.pack(...)
您正在为自己做太多的工作。您可以将参数传递给回调。例如:
self.b1 = Button(self.field, text="-", command=lambda: setfield(1))
这样,您的回调将使用参数1
进行调用,而您无需进行任何查找。