无法在按钮中嵌入图标

时间:2017-03-15 03:09:51

标签: python button icons imagebutton python-3.3

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

理想情况下,我试图创建一个带有标签的小型tkinter框架,该标签定义了框架细节和三个按钮。按钮和标签工作,放置顺利。当我尝试在按钮中添加一个Icon时,它会抛出我并出现错误。

到目前为止这是脚本:

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

任何帮助清除这一点都会令人惊讶。

干杯,

1 个答案:

答案 0 :(得分:1)

问题是您在创建PhotoImage实例之前尝试创建Tk。这是错误试图用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)的返回值。

您需要做的是改变:

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

  

警告:切勿在同一主窗口中混合网格和打包。 Tkinter很乐意度过余生,试图协商一个管理人员都满意的解决方案。而不是等待,杀死应用程序,再看看你的代码。一个常见的错误是对某些小部件使用了错误的父级。

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