python - 将 tkinter 图像嵌入到顶层

标签 python oop tkinter

我想将图像添加到 tkinter 中的顶框。它适用于 MainMenu,但不适用于 SideMenu。运行时,它应该在第一个菜单上显示_test.gif,当按下按钮时,打开第二个菜单并显示_test2.gif。目前,第二个菜单是空白的 - 无图像。

代码:

import tkinter as tk

class MainMenu(object):
    def __init__(self):
        self.launch_MainMenu()
    def launch_MainMenu(self):
        self._mainMenuWindow = tk.Tk()
        self.imageGIF = tk.PhotoImage(file="_test.gif");
        self.imageLabel = tk.Label(self._mainMenuWindow,image=self.imageGIF)
        self.imageLabel.grid(row=0,column=1,padx=10,pady=10)
        tk.Button(self._mainMenuWindow,text="Next Menu",
                  command=SideMenu).grid(row=0,column=2,padx=10)
        tk.mainloop()

class SideMenu(object):
    def __init__(self):
        self.launch_sideMenu()
    def launch_sideMenu(self):
        self._sideWindow = tk.Toplevel()
        self.imageGIF2 = tk.PhotoImage(file="_test2.gif")
        self.imageLabel2 = tk.Label(self._sideWindow,image=self.imageGIF2)
        self.imageLabel2.grid(row=0,column=1,padx=10,pady=10)

最佳答案

以下更改将使其正常工作。名为 add_sidemenu() 的新方法已添加到类 MainMenu并用作 command= 的值参数传递给Button小部件在创建时。

在新方法中,它创建并保存 SideMenu实例。在您的代码中,该实例几乎在创建后就被删除,因为它没有存储在变量中。我也对 tk.PhotoImage 做了类似的事情实例——即使对于 MainMenu 中的实例来说这并不是绝对必要的因为tk.mainloop()调用launch_MainMenu()结尾防止它所在的局部变量过早超出范围(因此在仍然需要时不会将其删除)。无论如何,我还是这么做了,因为这通常是对 tkinter 中使用的所有图像执行此操作的一个很好的做法。 (人们不这样做是这里出现如此多相关问题的一个重要原因)。

我还尝试重新格式化您的代码,使其遵循 PEP 8 - Style Guide for Python Code接近一点了。我强烈建议您阅读并开始遵循中的指南——您的代码将更易于其他人(和您)阅读(以及简化调试和维护)。

import tkinter as tk

class MainMenu(object):
    def __init__(self):
        self.launch_MainMenu()

    def launch_MainMenu(self):
        self._mainMenuWindow = tk.Tk()
        self.imageGIF = tk.PhotoImage(file="_test.gif");
        imageLabel = tk.Label(self._mainMenuWindow, image=self.imageGIF)
        imageLabel.grid(row=0, column=1, padx=10, pady=10)
        tk.Button(self._mainMenuWindow, text="Next Menu",
                  command=self.add_sidemenu).grid(row=0, column=2, padx=10)
        tk.mainloop()

    def add_sidemenu(self):
        self.sidemanu = SideMenu()
        self.sidemanu.grid(row=0, column=2, padx=10)

class SideMenu(object):
    def __init__(self):
        self.launch_sideMenu()

    def launch_sideMenu(self):
        self._sideWindow = tk.Toplevel()
        self.imageGIF2 = tk.PhotoImage(file="_test2.gif")
        self.imageLabel2 = tk.Label(self._sideWindow, image=self.imageGIF2)
        self.imageLabel2.grid(row=0, column=1, padx=10, pady=10)

mainMenu = MainMenu()

关于python - 将 tkinter 图像嵌入到顶层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48217059/

相关文章:

oop - Matlab 中的依赖可观察属性。它有效吗?

python - tkinter 的时间选择器

python - 条目小部件内容不随函数调用而改变

Python - 仅当条件适用时的组合

javascript - 使用 Python 和 Selenium Webdriver 抓取 javascript

oop - 在 VBA 中使用类模块作为命名空间有什么陷阱吗

c# - API 扩展中的对象链接与方法

Python tkinter Canvas 在启动期间获取可见区域

python - Keras2 ImageDataGenerator 还是 TensorFlow tf.data?

python - 如果在 1/100 秒内请求相同的 Flask api,sqlalchemy 在插入后不会更新