Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将tkinter图像嵌入顶层_Python_Oop_Tkinter - Fatal编程技术网

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)
        ...