无法将图标嵌入到按钮中

Can't embed a icon into a button

首先我想开始。我是 Python 的新手,在发布问题之前,我通过之前的各种帖子进行了广泛的研究和反复试验。

理想情况下,我正在尝试创建一个带有定义框架详细信息的标签和三个按钮的小型 tkinter 框架。按钮和标签有效,放置也很顺利。当我尝试向按钮中添加一个图标时,它抛出了我和错误。

这是目前的脚本:

import tkinter
from tkinter import *

def doNothing():
    print("doNothing")

icon1=PhotoImage(file="icon1.png")
icon2=PhotoImage(file="icon2.png")
icon3=PhotoImage(file="icon3.png")

W=tkinter.Tk()
W.geometry("325x300+0+0")
W.configure(bg="gray10")

FRAME1=Frame(W, width=100, height =100)
FRAME1.place(x=0,y=0)
LABEL1=Label(FRAME1,relief=FLAT, text="Profile",font="Verdana 10 bold",width=25, height =1).grid(row=0, column=0)
Button1= Button(FRAME1,relief=FLAT, width=3, height =1,command=doNothing).grid(row=0, column=1)
Button1.config(image=icon1)
Button1.pack()
Button2= Button(FRAME1,relief=FLAT, width=3, height =1,command=doNothing).grid(row=0, column=2)
Button2.config(image=icon2)
Button2.pack()
Button3= Button(FRAME1,relief=FLAT, width=3, height =1,command=doNothing).grid(row=0, column=3)
Button3.config(image=icon3)
Button3.pack()

W.mainloop()

当我 运行 这个脚本时,我得到以下输出。

Traceback (most recent call last):
  File "C:/Users/ADRIA/PycharmProjects/LATAM/TESTING CODE.py", line 7, in <module>
icon1=PhotoImage(file="icon1.png")
  File "C:\Users\ADRIA\AppData\Local\Programs\Python\Python35\lib\tkinter\__init__.py", line 3394, in __init__
Image.__init__(self, 'photo', name, cnf, master, **kw)
  File "C:\Users\ADRIA\AppData\Local\Programs\Python\Python35\lib\tkinter\__init__.py", line 3335, in __init__
raise RuntimeError('Too early to create image')
RuntimeError: Too early to create image

任何帮助解决这个问题的帮助都会很棒。

干杯,

问题是您试图在创建 Tk 实例之前创建 PhotoImage。这就是错误试图用 Too early to create image.

告诉您的内容

简单地切换一下:

icon1=PhotoImage(file="icon1.png")
icon2=PhotoImage(file="icon2.png")
icon3=PhotoImage(file="icon3.png")

W=tkinter.Tk()

所以 tkinter.Tk() 像这样排在第一位:

W=tkinter.Tk()

icon1=PhotoImage(file="icon1.png")
icon2=PhotoImage(file="icon2.png")
icon3=PhotoImage(file="icon3.png")

您遇到的另一个问题是因为您这样分配 Button1

Button1= Button(FRAME1,relief=FLAT, width=3, height =1,command=doNothing).grid(row=0, column=1)

您没有将 Button 实例分配给 Button1 您实际分配的是 .grid(row=0, column=1) 的 return 值。

你需要做的是改变:

Button1= Button(FRAME1,relief=FLAT, width=3, height =1,command=doNothing).grid(row=0, column=1)
Button1.config(image=icon1)

进入:

Button1= Button(FRAME1,relief=FLAT, width=3, height =1,command=doNothing)
Button1.grid(row=0, column=1)
Button1.config(image=icon1)

您也必须这样做,但是 Button2Button3

另外never mix grid and pack.

Warning: Never mix grid and pack in the same master window. Tkinter will happily spend the rest of your lifetime trying to negotiate a solution that both managers are happy with. Instead of waiting, kill the application, and take another look at your code. A common mistake is to use the wrong parent for some of the widgets.

因此,如果您想使用 Button*.grid(),则必须删除 Button.pack() 调用。