【问题标题】:Trying to add an image that functions like a button, but this error, image "pyimage2" doesn't exist, pops up尝试添加功能类似于按钮的图像,但弹出此错误,图像“pyimage2”不存在
【发布时间】:2019-04-30 00:08:15
【问题描述】:

我已经有一组格式与下面类似的代码,并且似乎可以正常工作。但不知何故,这个图像没有弹出。它们与代码位于同一文件夹中。 Def small 是使图像正常工作的代码,而 def stripes 是给我一个错误的代码。

from tkinter import *
import tkinter as tk
from tkinter import ttk

def small():
    s = Tk()
    s.title('Small Preset Shirt (Not fit to scale)')
    canvas = Canvas(s, width = 800, height = 100)
    canvas.pack()
    b1=ttk.Button(s,text='Click to Start', command = questions)
    b1.pack()
    photo = PhotoImage(file = 'small.png')
    b1.config(image=photo,compound=RIGHT)
    s.mainloop()

def stripes():
    stripes = Tk()
    stripes.title('Black Shirt with Stripes')
    canvas = Canvas(stripes, width = 800, height = 100)
    canvas.pack()
    b2=ttk.Button(stripes,text='Click to See Final Price', command = final)
    b2.pack()
    photo = PhotoImage(file = 'stripes.png')
    b2.config(image=photo,compound=RIGHT)
    stripes.mainloop()

这是完整的回溯:

Exception in Tkinter callback
Traceback (most recent call last):
File              "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/tkinter        /__init__.py", line 1705, in __call__
return self.func(*args)
File "/Users/Business/Documents/Python/small.py", line 159, in  stripes
b2.config(image=photo,compound=RIGHT)
File  "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/tkinter.   /__init__.py", line 1485, in configure
return self._configure('configure', cnf, kw)
File   "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/tkinter.   /__init__.py", line 1476, in _configure
self.tk.call(_flatten((self._w, cmd)) + self._options(cnf))
_tkinter.TclError: image "pyimage2" doesn't exist

【问题讨论】:

  • 这两个函数是怎么调用的?您是否使用线程同时执行这两个功能?

标签: python-3.x tkinter tkinter-canvas ttk


【解决方案1】:

当您收到“_tkinter.TclError: image "pyimage2" doesn't exist”或类似的错误消息时,这意味着 tkinter 无法确定它是哪个窗口的照片。这是由于多个Tk() 窗口所致。当您使用多个 Tk 时,几乎没有其他事情会产生问题,这就是为什么 Tkinter 有另一种类型的窗口 Toplevel 并且它指的是主窗口,就像子窗口一样。

让我们来看看你的代码..

除了那个错误之外,我在这里看到的其他问题很少。

  1. 就像我说的那样,不超过一个Tk() 窗口。我相信你可能不止两个。

  2. 如果您有一个主窗口并决定使用 Toplevel 再打开几个,那么请不要使用另一个 mainloop() 一个足以打开尽可能多的 Toplevel 窗口,但请记住至少使用一个 mainloop() 在代码的结尾。

  3. 1234563所以在这种情况下总是创建一个引用。

由于您的代码不可运行,所以我添加了必要的东西来运行和测试它。

from tkinter import *
from tkinter import ttk

Main_window = Tk()  # Make only one Tk main window 
Main_window.geometry('300x150')
Main_window.title("Get Shirts (Buy 1 get 1 Free)")

def small():
    s = Toplevel()   # For secondary window use Toplevel 
    s.title('Small Preset Shirt (Not fit to scale)')
    canvas = Canvas(s, width = 800, height = 100)
    canvas.pack()
    b1=ttk.Button(s,text='Click to Start', command = None)
    b1.pack()
    photo = PhotoImage(file = 'logo.png')
    b1.img_ref = photo      # Create a reference 
    b1.config(image=photo,compound=RIGHT)
    # s.mainloop()      # Don't use mainloop more than once


def stripes():
    stripes = Toplevel()  # For secondary window use Toplevel 
    stripes.title('Black Shirt with Stripes')
    canvas = Canvas(stripes, width = 800, height = 100)
    canvas.pack()
    b2=ttk.Button(stripes,text='Click to See Final Price', command = None)
    b2.pack()
    photo = PhotoImage(file = 'logo.png')
    b2.img_ref = photo      # Sometimes images in functions becomes garbage value.
    b2.config(image=photo,compound=RIGHT)
    # stripes.mainloop()      # Using two of these will do nothnig.


Category_Lb = Label(Main_window, text='Category', font=('',25))
Category_Lb.pack()

Cate_1 = ttk.Button(Main_window, text='Small Preset Shirt', command=small)
Cate_1.pack()

Cate_2 = ttk.Button(Main_window, text='Black Shirt with Stripes', command=stripes)
Cate_2.pack()


Main_window.mainloop()

【讨论】:

    猜你喜欢
    • 2014-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-04
    相关资源
    最近更新 更多