为了账号安全,请及时绑定邮箱和手机立即绑定

小部件未显示在 Tkinter GUI 中

小部件未显示在 Tkinter GUI 中

犯罪嫌疑人X 2021-08-24 14:48:47
我创建了代码,以便为我正在开发的井字游戏程序显示一个 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()有人能帮我找出为什么我在运行程序时得到一个空帧吗?
查看完整描述

1 回答

?
SMILET

TA贡献1796条经验 获得超4个赞

有人能帮我找出为什么我在运行程序时得到一个空帧吗?

这是因为您没有将其添加到窗口中。考虑这个代码:

self.field.grid

它绝对没有任何作用。要显示该窗口,您必须调用该函数:

self.field.grid()

在我看来,一个类永远不应该调用gridorpackplaceon 自身。那应该是调用者的工作。进入是一个好习惯,因为它促进了代码重用。

我个人会删除该行并将最后几行更改为:

board = GameBoard(root)
board.grid() # or board.pack(...)

你正在为自己做太多的工作。您可以将参数传递给回调。例如:

self.b1 = Button(self.field, text="-", command=lambda: setfield(1))

这样,您的回调将使用参数调用1,您无需进行任何类型的查找。


查看完整回答
反对 回复 2021-08-24
  • 1 回答
  • 0 关注
  • 127 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信