我刚开始编码,已经有一个我无法弄清楚的错误。我正在尝试制作类似扫雷的程序。我的问题是,当我尝试让一个单元格显示旗帜、地雷或任何其他图像(不是数字或字母,我可以很好地管理)的图片时,网格就会中断。
这是我的代码的一个非常简洁的部分来显示我的问题:
from tkinter import *
from functools import partial as part
from PIL import Image, ImageTk
class Grid:
def __init__(self, master):
self.master = master
self.images, self.frames, self.grid = [], [], []
self.images = {
"mine": ImageTk.PhotoImage(image=Image.open("Sprites/mine.png").resize((20, 20))),
"flag": ImageTk.PhotoImage(image=Image.open("Sprites/flag.png").resize((20, 20))),
"ghost_flag": ImageTk.PhotoImage(image=Image.open("Sprites/ghost_flag.png").resize((20, 20)))}
self.draw_grid()
def _on_click(self, event, x, y, *args):
if event == "left-click":
self.grid[x][y]["widget"]["image"] = self.images["mine"]
if event == "right-click":
self.grid[x][y]["widget"]["image"] = self.images["flag"]
def draw_grid(self):
for x in range(0, 9):
self.frames.append(Frame(self.master))
self.frames[len(self.frames) - 1].pack(side="top")
self.grid.append([])
for y in range(0, 9):
self.grid[x].append({"widget": Label(self.frames[x], bg="#888888", width=4, height=2, image=None)})
self.grid[x][y]["widget"].pack(fill=BOTH, expand=1, side="left", padx=1, pady=1)
self.grid[x][y]["widget"].bind("<Button-1>", part(self._on_click, "left-click", x, y))
self.grid[x][y]["widget"].bind("<Button-2>", part(self._on_click, "right-click", x, y))
self.grid[x][y]["widget"].bind("<Button-3>", part(self._on_click, "right-click", x, y))
root = Tk()
grid = Grid(root)
root.mainloop()
我显然摆脱了任何 Minesweeper 核心代码,该程序只在左键单击时放置地雷,在右键单击时放置标志。代码中唯一锁定大小的两个部分是标签创建中的.resize(x, y)
函数width
和height
参数。
结果是这样的:
希望可以有人帮帮我,
祝你有美好的一天
编辑:另外,如果有人知道如何.bind
更有效地,我会很高兴。
编辑2:经过一番思考,我意识到有一个愚蠢的解决方案,那就是做一些类似的事情:
self.grid[x][y]["widget"]["width"] = 92
但我希望有一个更清洁的解决方案。