首页 > 解决方案 > Tkinter 使按钮比预期的要大

问题描述

考虑以下生成 3x3 按钮网格的代码:

import tkinter as tk

class Game:

    def __init__(self, master):
        self.master = master
        master.geometry("600x600")
        self.options = dict(font=("Courier 14", 30), fg="black", height=200, width=200)
        self.buttons = []
        for r in range(3):
            self.buttonrow = []
            self.buttons.append(self.buttonrow)
            for c in range(3):
                self.button = tk.Button(master, command=lambda r=r, c=c: self.response(r, c), **self.options)
                self.button.grid(row=r, column=c)
                self.buttonrow.append(self.button)
        master.mainloop()

    def response(self, row, col):
        self.buttons[row][col].config(text="X", state=tk.DISABLED)

if __name__ == "__main__":
    root = tk.Tk()
    Game(root)

当我写master.geometry("600x600")然后height=200, width=200in 时self.options,我希望整个 3x3 网格适合父窗口。但是,当我运行这个程序时,我只看到 1 个超出父窗口边界的巨大按钮,当我按下它时,我什至看不到X按钮上出现的那个,因为它远远超出了窗户。为什么会发生这种情况,我该如何解决?

标签: python-3.xtkinter

解决方案


所以我使用了<Button-1>事件格式,其中当鼠标按钮(按钮 1 是最左边的鼠标按钮)在小部件上按下时,鼠标指针的当前位置(相对于小部件)在 x 和 y 成员中提供传递给回调的事件对象。

我没有geometry为主窗口提供任何固定(宽度和高度),因为窗口将根据其中的小部件自行调整大小,然后将resizable选项设置为以false使窗口保持其外观。

您可以根据需要提供按钮大小。

这些更改解决了这两个问题:

  1. 按钮大小问题
  2. 按钮事件问题

代码:

import tkinter as tk

class Game:

    def __init__(self, master):
        self.master = master
        self.master.resizable(0,0)
        # row index
        for row in range(3):
            # col index
            for col in range(3):
                self.button = tk.Button(master, width=10, height=5)
                self.button.grid(row=row, column=col, padx=8, pady=8, ipadx=10, ipady=4)
                self.button.bind("<Button-1>", self.callback)
        master.mainloop()

    def callback(self, event):
        # get the clicked button
        clicked_btn = event.widget
        text_at_row_col = clicked_btn.config(text='X', state='disabled')

if __name__ == "__main__":
    root = tk.Tk()
    Game(root)  

输出:

3x3 按键矩阵

按键矩阵

单击按钮时的X文本

按钮中的文字


推荐阅读