在tkinter中分配图像时按钮缩小 / python

1 投票
2 回答
1408 浏览
提问于 2025-04-18 07:22

我现在正在做一个记忆配对游戏,游戏的内容是要在一堆按钮的矩阵中找到配对的卡片...

具体来说,当你按下一个按钮时,这个按钮需要显示一张图片,并且要进入禁用状态,直到你按下另一个按钮。如果这个按钮是配对的卡片,它就应该一直保持这个状态。

我遇到的问题是,当我点击按钮并试图给它添加图片时,按钮会缩小,然后就没有其他反应了。我真的不知道为什么会这样,因为如果我只是改变按钮的颜色,它就能正常工作,而且不会缩小。

这是我的代码:

from tkinter import *
import os
import sys

def CargarImagenlvl1(nombre): #Define la funcion "global" que carga las imagenes necesarias
    ruta = os.path.join('Imagenes lvl1',nombre)
    imagen = PhotoImage(file=ruta)
    return imagen

#--------------------------------------------Imagenes----------------------------------------------------

def VentanaPlay():
    matriz = [0, 0, 0, 0, 0, 0, 0,
              0, 0, 0, 0, 0, 0, 0,
              0, 0, 0, 0, 0, 0, 0,
              0, 0, 0, 0, 0, 0, 0,
              0, 0, 0, 0, 0, 0, 0,
              0, 0, 0, 0, 0, 0, 0,
              0, 0, 0, 0, 0, 0, 0]

    VentanaPlay= Tk()
    VentanaPlay.title("Focus Now!")
    VentanaPlay.resizable(width=NO, height=NO)
    VentanaPlay.geometry("800x600")

    CanvPlay= Canvas(VentanaPlay, width=800, height=600, bg="white")
    CanvPlay.config(cursor="dotbox")
    CanvPlay.place(x=-1,y=-1)

    CanvPlay1= Canvas(CanvPlay)
    CanvPlay1.config(bg="white")
    CanvPlay1.place(x=1,y=1)

    ABOUT=CargarImagenlvl1("About.gif")

    def Matriz():
        global Bot
        Bot=[] #Botones ([Numero de boton])
        ind=0 #Indicador para crear la cantidad de botones
        c1,c2=0,0 #Columnas y filas
        while ind < 49:
            Bot.append(Button(CanvPlay1,width=10,height=5,bg="#309090"))
            Bot[ind].grid(row=c2,column=c1)
            ind+=1
            if c1==6: c1,c2=0,c2+5
            else: c1+=1
        Bot[0].config(command=lambda: dele(0)), Bot[1].config(command=lambda: dele(1))
        Bot[2].config(command=lambda: dele(2)), Bot[3].config(command=lambda: dele(3))
        Bot[4].config(command=lambda: dele(4)), Bot[5].config(command=lambda: dele(5))
        Bot[6].config(command=lambda: dele(6)), Bot[7].config(command=lambda: dele(7))
        Bot[8].config(command=lambda: dele(8)), Bot[9].config(command=lambda: dele(9))
        Bot[10].config(command=lambda: dele(10)), Bot[11].config(command=lambda: dele(11))
        Bot[12].config(command=lambda: dele(12)), Bot[13].config(command=lambda: dele(13))
        Bot[14].config(command=lambda: dele(14)), Bot[15].config(command=lambda: dele(15))
        Bot[16].config(command=lambda: dele(16)), Bot[17].config(command=lambda: dele(17))
        Bot[18].config(command=lambda: dele(18)), Bot[19].config(command=lambda: dele(19))
        Bot[20].config(command=lambda: dele(20)), Bot[21].config(command=lambda: dele(21))
        Bot[22].config(command=lambda: dele(22)), Bot[23].config(command=lambda: dele(23))
        Bot[24].config(command=lambda: dele(24)), Bot[25].config(command=lambda: dele(25))
        Bot[26].config(command=lambda: dele(26)), Bot[27].config(command=lambda: dele(27))
        Bot[28].config(command=lambda: dele(28)), Bot[29].config(command=lambda: dele(29))
        Bot[30].config(command=lambda: dele(30)), Bot[31].config(command=lambda: dele(31))
        Bot[32].config(command=lambda: dele(32)), Bot[33].config(command=lambda: dele(33))
        Bot[34].config(command=lambda: dele(34)), Bot[35].config(command=lambda: dele(35))
        Bot[36].config(command=lambda: dele(36)), Bot[37].config(command=lambda: dele(37))
        Bot[38].config(command=lambda: dele(38)), Bot[39].config(command=lambda: dele(39))
        Bot[40].config(command=lambda: dele(40)), Bot[41].config(command=lambda: dele(41))
        Bot[42].config(command=lambda: dele(42)), Bot[43].config(command=lambda: dele(43))
        Bot[44].config(command=lambda: dele(44)), Bot[45].config(command=lambda: dele(45))
        Bot[46].config(command=lambda: dele(46)), Bot[47].config(command=lambda: dele(47))
        Bot[48].config(command=lambda: dele(48))

    def dele(coordenada):
        if matriz[coordenada]==0:
            matriz[coordenada]=1
            Bot[coordenada].config(state=DISABLED, height=5, width=10,image=ABOUT) #Here I assign the image, wich is the part that makes the buttons shrink.

    Matriz()

    VentanaPlay.mainloop()

VentanaPlay()

这是我遇到的问题的截图:

https://i.stack.imgur.com/zrCLB.png sscreenshot

按钮在缩小,虽然我觉得图片是显示出来了,但尺寸非常小。顺便说一下,我确保图片的分辨率和按钮的大小完全一致,我甚至尝试过用更大的图片,但结果还是一样。

希望你们能帮我解决这个问题!谢谢!

附注:请原谅我糟糕的英语水平。

2 个回答

0

我在做一个类似的项目时也遇到了同样的问题。在我的情况下,我找到了一种解决办法,就是在主窗口上使用rowconfigure和columnconfigure来设置网格布局,并且使用了minsize选项。

下面是一个例子。虽然这个方法不算优雅,但对我解决特定的问题有效。

root = ttk.Tk()
root.title("Matchgame")
for x in range(4):
    root.rowconfigure(x,minsize=220, weight=1)
    root.columnconfigure(x,minsize=220, weight=1)

这样做可以防止底层的列和行缩小,即使所有的图片都显示在某一行或某一列中。

0

在tkinter的按钮上添加图片时,带有图片的按钮会改变,按钮的宽度和高度会以像素为单位来表示,而不是默认的其他单位,这种情况发生在按钮上没有图片时。

你写的代码是:

Bot[coordenada].config(state=DISABLED, height=5, width=10,image=ABOUT)

因为添加了图片,所以现在的高度和宽度都是以像素为单位。但其他没有图片的按钮仍然保持它们原来的较大尺寸。

希望这对你有帮助!这里有个链接... http://effbot.org/tkinterbook/button.htm

撰写回答