Python 3.x Tkinter使按钮比预期的大得多

Python 3.x Tkinter使按钮比预期的大得多,python-3.x,tkinter,Python 3.x,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) s

考虑以下代码,该代码生成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)

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

宽度
选项表示平均宽度字符的数量,而不是像素的数量。通过将宽度设置为200,您请求的宽度为200个字符

将按钮配置为具有图像时,
宽度
仅解释为像素

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

我没有给主窗口提供任何固定的
几何图形
(宽度和高度),因为窗口将根据其内部的小部件调整自身大小,然后将
可调整大小
选项设置为
,以便窗口保持其外观

您可以根据需要提供按钮的尺寸

这些变化解决了两个问题:

  • 按钮大小问题
  • 按钮事件问题
  • 代码:

    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)  
    
    将tkinter作为tk导入
    班级游戏:
    定义初始(自我,主):
    self.master=master
    self.master.可调整大小(0,0)
    #行索引
    对于范围(3)中的行:
    #col索引
    对于范围(3)中的列:
    self.button=tk.button(主控,宽度=10,高度=5)
    self.button.grid(行=行,列=列,padx=8,pady=8,ipadx=10,ipady=4)
    self.button.bind(“,self.callback)
    master.mainloop()
    def回调(自身、事件):
    #点击按钮
    单击了\u btn=event.widget
    text\u at_row\u col=单击了\u btn.config(text='X',state='disabled')
    如果名称=“\uuuuu main\uuuuuuuu”:
    root=tk.tk()
    游戏(根)
    
    输出:

    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
    文本


    谢谢!有没有办法计算一个字符有多少像素宽?如果我能计算出这个值,我就可以在父窗口中设置按钮。