Python 将tkinter图像嵌入顶层
我想在Python 将tkinter图像嵌入顶层,python,oop,tkinter,Python,Oop,Tkinter,我想在tkinter中将图像添加到顶框。它在主菜单上工作,但不在侧菜单上工作。运行时,它应在第一个菜单上显示_test.gif,按下按钮后,打开第二个菜单并显示_test2.gif。目前,第二个菜单为空白-无图像 代码: 以下更改将使其正常工作。名为add_sidemenu()的新方法已添加到类main menu,并在创建时用作传递给按钮小部件的命令=参数的值 在新方法中,它创建并保存一个侧菜单实例。在您的代码中,这个实例几乎在创建时就被删除了,因为它没有存储在变量中。我还对tk.PhotoIm
tkinter
中将图像添加到顶框。它在主菜单
上工作,但不在侧菜单
上工作。运行时,它应在第一个菜单上显示_test.gif,按下按钮后,打开第二个菜单并显示_test2.gif。目前,第二个菜单为空白-无图像
代码:
以下更改将使其正常工作。名为
add_sidemenu()
的新方法已添加到类main menu
,并在创建时用作传递给按钮
小部件的命令=
参数的值
在新方法中,它创建并保存一个侧菜单
实例。在您的代码中,这个实例几乎在创建时就被删除了,因为它没有存储在变量中。我还对tk.PhotoImage
实例做了类似的操作,即使它对于main菜单中的一个实例不是严格必需的,因为tk.mainloop()
在launch\u main菜单()的末尾调用可以防止它所在的局部变量过早地超出范围(所以在仍然需要的时候它不会被删除)。不管怎样,我还是这样做了,因为这通常是一个很好的实践,可以使用tkinter
中使用的所有图像(人们不这样做是这里有这么多相关问题的一个重要原因)
我还尝试重新格式化您的代码,使其更符合要求。我强烈建议您阅读并开始遵循代码中的指导原则,这将使其他人(和您)更容易阅读(以及简化调试和维护)
问题在于python的垃圾收集器。您没有保留对侧菜单
实例的引用,因此它被垃圾收集
由于tkinter如何实现的一个怪癖,这会导致图像对象被销毁,即使小部件本身没有被销毁
按钮的目标是类是非常不寻常的。相反,创建一个适当的函数来创建侧菜单
的实例,并保存对该对象的引用
class MainMenu(object):
...
def launch_ManMenu(self):
...
tk.Button(..., command=self.sidemenu, ...)
def sidemenu(self):
self.sidemenu = SideMenu()
您还需要在侧菜单中保留图像的引用,就像在主菜单中一样:
class SideMenu(object):
...
def launch_sideMenu(self):
...
self.my_image = tk.PhotoImage(...)
myCanvas.create_image(..., image=self.my_image)
...
这将有助于回答您的问题。您需要在局部变量(imageXxx)之前添加“self”。@kunif:起初我也这么认为,但这不是问题所在。对不起,我过度简化了我的原始代码。它是两个不同的图像。MainMenu类的变量前面没有“self”。还有,对于initialie Tk()来说更好吗和mainloop在主菜单课程之外?谢谢你的建议kunif。我在主菜单中的所有内容中添加了self。但是第二个图像仍然没有显示。你能提供一些帮助吗?这太棒了,非常感谢你过来帮助我。我正在制作的程序是帮助那些真正需要帮助的人完成它,我又回到了完成它的路上!祝你有一个美好的一天!这太棒了,非常感谢你来帮助我。我正在制作的程序是帮助那些真正需要它的人,我又回到了完成它的路上!祝你有一个美好的一天!我希望我也能绿色勾选这个答案!
class MainMenu(object):
...
def launch_ManMenu(self):
...
tk.Button(..., command=self.sidemenu, ...)
def sidemenu(self):
self.sidemenu = SideMenu()
class SideMenu(object):
...
def launch_sideMenu(self):
...
self.my_image = tk.PhotoImage(...)
myCanvas.create_image(..., image=self.my_image)
...