【问题标题】:Assigning and updating the image part of a Canvas widget in tkinter (Error)在 tkinter 中分配和更新 Canvas 小部件的图像部分(错误)
【发布时间】:2013-11-10 15:59:14
【问题描述】:

首先,我知道有类似的解决方案,我已经查看了所有这些解决方案。他们都没有工作 - 这不是重复的。我的程序是一个刽子手程序,它根据玩家给出的错误猜测来更新图像。这是我的代码。随意编辑和删除不相关的代码。我没有,因为我不明白这个错误。代码:

import random,time,sys
from tkinter import *

sys.path.append('C:/Users/Thornton/Desktop/Python Stuff/PyHang/images/') #defining the full path

class App:

    def __init__(self,master):
        frame=Frame(master)
        frame.pack()
        global e1,game

        Label(frame,text='Guess').grid(row=2)
        e1=Entry(frame)
        e1.grid(row=2,column=1)

        slider=Scrollbar(frame)
        slider.grid(row=1,column=2)
        self.game=Listbox(frame,height=3,yscrollcommand=slider.set)
        self.game.grid(row=1,column=1)
        slider.config(command=self.game.yview)

        self.status=Canvas(frame,width=220,height=125) #creating the canvas
        self.status.grid(row=0,column=1)

        Button(frame,text='OK',command=self.guess).grid(row=2,column=2)
        root.bind('<Return>',self.guess)
        Button(frame,text="New\nGame",command=self.new_game).grid(row=1,column=0)
        root.bind('<Home>',self.new_game)

        self.new_game()

    def guess(self,event=None):
        frame=Frame()
        frame.pack()
        global losses

        letter=e1.get().strip()
        if len(letter)!=1 or letter.isdigit() or letter in self.used:
            pass
        else:
            self.used.append(letter)
            if letter in self.secret:
                self.game.insert(END,"\n",'Correct!')
                positions=[i for i,item in enumerate(self.secret) if item==letter]
                for place in positions:
                    self.display[place]=letter
            else:
                self.game.insert(END,"\n",'Incorrect.')
                self.losses+=1
                self.status.image=PhotoImage(str(losses) + '.gif') #updating image
            self.game.insert(END,''.join(self.display),'Used: ' + ''.join(self.used))
            if self.losses==6:
                self.game.insert(END,'You Lose.',"(" + ''.join(self.secret) + ")")
            elif self.display==self.secret:
                self.game.insert(END,'You Win!')
            self.game.yview(END)
        e1.delete(0,END)

    def new_game(self,event=None):
        frame=Frame()
        frame.pack()
        global game,losses,used,secret,display

        self.secret=list(random.choice(open('dictionary.txt').readlines()))
        del self.secret[-1]

        self.losses=0
        self.used=[]
        self.display=['*' for letter in self.secret]

        self.status.image=PhotoImage(file='0.gif') #resetting image
        self.status.create_image(image=self.status.image)

        e1.delete(0,END)
        self.game.delete(0,END)
        self.game.insert(END,''.join(self.display))

root = Tk()
root.title('PyHang 2.0')
app = App(root)
root.mainloop()

输出:

File "C:\Users\Thornton\Desktop\Python Stuff\PyHang\pyhang2.0.py", line 72, in new_game
  self.status.image=PhotoImage(file='0.gif')
File "C:\Program Files (x86)\Python\lib\tkinter\__init__.py", line 3287, in __init__
  Image.__init__(self, 'photo', name, cnf, master, **kw)
File "C:\Program Files (x86)\Python\lib\tkinter\__init__.py", line 3243, in __init__
  self.tk.call(('image', 'create', imgtype, name,) + options)
_tkinter.TclError: couldn't open "0.gif": no such file or directory

图片在文件夹images,范围从06.gif,对应变量losses。所有文件都存在,如您所见,我已经定义了完整路径。请耐心等待,因为我是 tkinter 的新手。

【问题讨论】:

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


    【解决方案1】:

    我相信您可能误解了sys.path,因为它用于定位导入的 Python 模块。在PhotoImage(file='0.gif') 中查找 GIF 没有帮助。错误是说明找不到图像,因此您只需要使用运行脚本的正确相对路径(或使用图像的绝对路径)。

    要验证这一点,请更改:

        self.status.image=PhotoImage(file='0.gif') #resetting image
    

    到这里:

        self.status.image=PhotoImage(file='images/0.gif') #resetting image
    

    注意:这假设脚本和图像目录都在同一个目录中,并且您在该目录中运行脚本。

    【讨论】:

    • 现在我得到IndexError: tuple index out of range,一旦进行了建议的修改并运行代码。运行程序 fo3 完整的错误代码。
    • 没错,我可以验证同样的错误。然而,这是一个不同的问题,这是这个问题的答案。您可以随时提出不同的问题。
    • 环顾四周,我设法解决了它。感谢您为我指明了正确的方向!
    • 太棒了!很高兴你想出来了。你只需要告诉画布你想要放置图像的位置。编码愉快!
    猜你喜欢
    • 2011-06-18
    • 2020-07-23
    • 1970-01-01
    • 2011-03-29
    • 2021-12-04
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多