0

我刚开始编码,已经有一个我无法弄清楚的错误。我正在尝试制作类似扫雷的程序。我的问题是,当我尝试让一个单元格显示旗帜、地雷或任何其他图像(不是数字或字母,我可以很好地管理)的图片时,网格就会中断。

这是我的代码的一个非常简洁的部分来显示我的问题:

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)函数widthheight参数。

结果是这样的:

见图片

希望可以有人帮帮我,

祝你有美好的一天

编辑:另外,如果有人知道如何.bind更有效地,我会很高兴。

编辑2:经过一番思考,我意识到有一个愚蠢的解决方案,那就是做一些类似的事情:

self.grid[x][y]["widget"]["width"] = 92

但我希望有一个更清洁的解决方案。

4

0 回答 0