我在单独的类中显示画布图像时遇到一些问题。
我有一个顶级应用程序和另一个顶级类,代表一种面板,主窗口画布的图像较小,用于导航目的。
我知道我必须保留对画布图像的引用,以便从垃圾收集中保护它,但是,我无法达到预期的效果。
面板类的代码如下:
from PIL import Image, ImageTk
class MultiPanel(Toplevel):
def __init__(self,parent,cookie):
Toplevel.__init__(self,parent)
self.parent=parent
self.transient(self.parent)
self.attributes('-topmost',True)
self.protocol("WM_DELETE_WINDOW",self._NULL)
self.visible=[BooleanVar()] * 2
for i in range(0,1): self.visible[i].set(True)
filename=cookie['basename']+os.sep+cookie['current_file']
self.PANEL=PanedWindow(self,orient=VERTICAL)
self.PANEL.pack(fill=BOTH,expand=1)
self.nFrame=Frame(self.PANEL)
self.Navi=NaviPanel(self.nFrame, imgpth=filename)
self.image=self.Navi.image
self.Navi.pack()
self.bFrame=Frame(self.nFrame)
bToggle=Checkbutton(self.bFrame,text='Info panel', variable=self.visible[1],onvalue=True,offvalue=False,command=lambda i=0:self.toggle_vis(index=i))
bToggle.pack(side=RIGHT)
self.bFrame.pack(side=RIGHT)
self.bottom=[]
self.bottom.append(Frame(self.PANEL))
l=Label(self.bottom[0], text="bottom pane").pack()
self.PANEL.add(self.nFrame)
self.PANEL.add(self.bottom[0])
def _NULL(self):
pass
def toggle_vis(self,index):
if not self.visible[index+1].get(): self.PANEL.forget(self.PANEL.panes()[index+1])
else: self.PANEL.add(self.bottom[index])
class NaviPanel(Frame):
def __init__(self,parent,imgpth):
Frame.__init__(self,parent)
self.image=ImageTk.PhotoImage(Image.open(os.path.normpath(imgpth)))
self.parent=parent
self.canvas=Canvas(self)
self.canvas.pack(expand=YES,fill=BOTH)
self.canvas.create_image(0,0,image=self.image,anchor="ne")
def redraw(self,x,y,cextent,pImage,scale,col,fname):
self.canvas.create_image(0,0,image=pImage,anchor="nw",tags=("bg",0)) #in the panel
self.canvas.configure(width=x,height=y)
self.filename_label.configure(text=fname)
rect = [int(float(i)/scale) for i in cextent] #rectangle coordinates
self.canvas.create_rectangle(rect,outline=col,tags=("view",0)) #in the panel
def moveview(self,x,y,cextent,scale,col):
self.canvas.delete('view') #destroy rectangle
rect = [int(float(i)/scale) for i in cextent] #rectangle coordinates
self.canvas.create_rectangle(rect,outline=col,tags=("view",0)) #in the panel
def hide(self):
self.withdraw()
def show(self):
self.deiconify()
def toggle(self,Event=None):
self.visible = not self.visible
if self.visible:
self.hide()
else:
self.show()
def _NULL(self):
pass
在我的主要应用程序中,我通过
创建窗口 self.panel=MultiPanel(self,cookie=self.cookie,ptitle=PTITLE)
self.pImage=self.panel.image
我尝试了将主应用程序中的实际图像引用到canvas frame
元素的所有方式,以及从主应用程序引用整个画布。
我的错误在哪里?
PS:很抱歉很长的帖子!
答案 0 :(得分:0)
我很抱歉,但错误是在我用于画布图像的错误锚点选项中。用anchor ='nw'替换它解决了一切。看到一个与没有引用图像的问题非常相似的行为是非常令人困惑的,所以我有点迷茫!