Tkinter图标图标无法正常工作或在Labelframe

时间:2017-06-07 15:13:32

标签: python tkinter

这个问题涉及Python的Tkinter。

我首先制作了这个GUI,一个Labelframe中一个简单的两列行,右边有一个图标:

enter image description here

基于以下代码,上述行为是正确的和预期的:

import tkinter as tk
import tkinter.ttk as ttk
from PIL import Image, ImageTk

root = tk.Tk()

icon_colours_fp = r"D:\Dropbox\coding\python\experiments\icon_component.gif"
icon_col = tk.PhotoImage(file=icon_colours_fp)
# icon_col = ImageTk.PhotoImage(Image.open(icon_colours_fp))

tk.Label(root, text="Past").grid(row=0, column=0)
tk.Label(root, text="Today").grid(row=1, column=0)
tk.Label(root, text="Future").grid(row=2, column=0)

_b = ttk.Button(root, image=icon_col)
_b['image'] =icon_col
_b.grid(row=0, column=1)

root.mainloop()

然后我将代码重新编写为类,希望在Labelframe中生成类似内容:

import tkinter as tk
import tkinter.ttk as ttk
from PIL import Image, ImageTk

class Options(tk.Frame):

    def __init__(self, parent):

        super().__init__()

        main_labelframe = ttk.LabelFrame(parent, text="Test Labelframe")
        main_labelframe.pack(fill=tk.BOTH, expand=1)

        frame_1 = tk.Frame(main_labelframe)
        frame_1_sep = ttk.Separator(main_labelframe, orient=tk.VERTICAL)
        frame_2 = tk.Frame(main_labelframe)

        frame_1.pack(side=tk.LEFT)
        frame_1_sep.pack(side=tk.LEFT, fill=tk.BOTH)
        frame_2.pack(side=tk.LEFT)

        tk.Label(frame_1, text="Past").grid(row=0, column=0)
        tk.Label(frame_1, text="Today").grid(row=1)
        tk.Label(frame_1, text="Future").grid(row=2)

        icon_colours_fp = r"D:\Dropbox\coding\python\experiments\icon_component.gif"
        icon_col = tk.PhotoImage(file=icon_colours_fp)
        _b = ttk.Button(frame_2, image=icon_col)
        _b['image'] = icon_col
        _b.grid(row=0, column=0)


class Gui(tk.Tk):

    def __init__(self):

        super().__init__()
        options = Options(self)
        options.pack()


gui = Gui()
gui.mainloop()

然后代码在两个方面失败了:

  1. 图标无法显示。
  2. ttk按钮变得不对齐。 (它出现在中心,而通过网格,它应该出现在顶部。)
  3. 失败的代码如下所示:

    enter image description here

    我已尝试过:其中,我将几何管理器更改为.pack(),并更改了ttk.Button的父级,但没有成功。我会很高兴看到我出错的地方,特别是关于消失的图标。

1 个答案:

答案 0 :(得分:0)

您没有保留对图片的引用。最简单的方法是改变:

icon_col = tk.PhotoImage(file=icon_colours_fp)
b = ttk.Button(frame_2, image=icon_col)
_b['image'] = icon_col

要:

self.icon_col = tk.PhotoImage(file=icon_colours_fp)
b = ttk.Button(frame_2, image=self.icon_col)