gpt4 book ai didi

python - 在 tkinter 中分配和更新 Canvas 小部件的图像部分(错误)

转载 作者:行者123 更新时间:2023-11-30 23:31:29 28 4
gpt4 key购买 nike

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

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 的新手。

最佳答案

我相信您可能误解了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

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

关于python - 在 tkinter 中分配和更新 Canvas 小部件的图像部分(错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19891805/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com