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)
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=200
in 时self.options
,我希望整个 3x3 网格适合父窗口。但是,当我运行这个程序时,我只看到 1 个超出父窗口边界的巨大按钮,当我按下它时,我什至看不到X
按钮上出现的那个,因为它远远超出了窗户。为什么会发生这种情况,我该如何解决?
解决方案
所以我使用了<Button-1>
事件格式,其中当鼠标按钮(按钮 1 是最左边的鼠标按钮)在小部件上按下时,鼠标指针的当前位置(相对于小部件)在 x 和 y 成员中提供传递给回调的事件对象。
我没有geometry
为主窗口提供任何固定(宽度和高度),因为窗口将根据其中的小部件自行调整大小,然后将resizable
选项设置为以false
使窗口保持其外观。
您可以根据需要提供按钮大小。
这些更改解决了这两个问题:
- 按钮大小问题
- 按钮事件问题
代码:
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
文本
推荐阅读
- python-3.x - 检查列表中的所有点都在矩形内
- c# - Bot 无法通过 WCF(连接服务)插入 SQL 数据库?
- javascript - 使用 python 中的请求从网站获取 cookie
- database - 使用 Vue 和 API 端点处理多个寄存器
- java - 列表无法转换为列表
- filter - GraphQL - 动态地将字段添加到结果中
- php - 使用 PHP 通过我的网站在 Onedrive 上上传和下载文件
- autodesk-forge - 创建对查看器的持久访问
- scala - Akka Typed Actors 和 AKka Http - 找不到 ActorRefFactory
- html - 如何在css中初始化背景图像的起点?