【问题标题】:Can Python's Tkinter show both text and image in a Button widget? [duplicate]Python 的 Tkinter 可以在 Button 小部件中同时显示文本和图像吗? [复制]
【发布时间】:2017-11-07 13:13:20
【问题描述】:

为了练习,我正在使用 Python 的 Tkinter 复制/重新创建另一个软件 GUI 的“选项”部分。这是我的模型 GUI:

此时,我已经编码如下:

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

class Options(tk.Frame):

    def __init__(self, parent):

        random_numbers = lambda: [random.random() for i in range(4)]
        text_font_icon = r"D:\Dropbox\coding\python\experiments\6 - tkinter\icons\icon_mail.gif"

        labelframe_general     = tk.LabelFrame(parent, text="General")
        labelframe_general.pack()

        tk.Label(labelframe_general, text="Startup tab", justify=tk.LEFT).grid(column=0, row=0, sticky=tk.W)
        ttk.OptionMenu(labelframe_general, tk.StringVar(), random_numbers()[0], *random_numbers()).grid(column=1, row=0)

        tk.Label(labelframe_general, text="Episode display format", justify=tk.LEFT).grid(column=0, row=1, sticky=tk.W)
        ttk.OptionMenu(labelframe_general, tk.StringVar(), random_numbers()[0], *random_numbers()).grid(column=1, row=1)

        tk.Label(labelframe_general, text="Number of banner images to\ndownload per series", justify=tk.LEFT).grid(column=0, row=2, sticky=tk.W)
        ttk.OptionMenu(labelframe_general, tk.StringVar(), random_numbers()[0], *random_numbers()).grid(column=1, row=2)

        tk.Checkbutton(labelframe_general, text="Automatically scroll episode list to bottom", variable=tk.StringVar()).grid(column=0, row=3, columnspan=2, sticky=tk.W)
        tk.Checkbutton(labelframe_general, text='Move "The" to the end of series name', variable=tk.StringVar()).grid(column=0, row=4, columnspan=2, sticky=tk.W)
        tk.Checkbutton(labelframe_general, text="Close epCheck with the <Esc> key", variable=tk.StringVar()).grid(column=0, row=5, columnspan=2, sticky=tk.W)

        _photo = tk.PhotoImage(file=text_font_icon)
        b = ttk.Button(labelframe_general, text="List & Overview font (right-click for default", image=_photo)
        b.image = _photo
        b.grid(sticky=tk.NSEW, columnspan=2)


class Gui(tk.Tk):

    def __init__(self):

        super().__init__()
        Options(self)

        self.bind('<Escape>', lambda event: self.destroy())

gui = Gui()
gui.mainloop()[![enter image description here][2]][2]

上面产生了这个:

我的问题只在于 ttk.Button(所有其他小部件的行为都与我预期的一样)。

按钮仅显示图标,但未说明文本“列表和概览字体”。我的问题:

  1. 为什么在使用图像时文本从按钮中消失了?

  2. Tkinter 能否在 Buttons 中显示一个图标以及文本或文本旁边(如上面的模型 GUI 中)?

  3. Tkinter 的“工具栏”或小部件是否能够与文本一起显示图标,或者我是否只能选择纯文本按钮和纯图像按钮?

我尝试过使用 Menubutton 并测试过其他来源的代码,但无济于事。将不胜感激。

【问题讨论】:

    标签: python button tkinter toolbar


    【解决方案1】:

    您需要为ttk.Buttoncompound 选项指定一个值。

    如果您同时提供图像和文本选项,复合选项 指定图像相对于文本的位置。价值 可能是 tk.TOP(文本上方的图像)、tk.BOTTOM(文本下方的图像)、 tk.LEFT(文本左侧的图像)或 tk.RIGHT(文本左侧的图像) 文本的右侧)。

    当您同时提供图像和文本选项但未指定时 复合选项,图片会出现,文字不会。

    【讨论】:

    • 谢谢!有效。另外:1)有没有办法从文本中“填充”图像,以便它们之间有一些空间?并且 2) 你可以在 Button 小部件中对图像/文本进行文本对齐/对齐吗?
    • @anonnoir 据我所知,不,你不能做任何这些。添加填充的唯一选项是添加额外的空格,但由于字体等原因可能不可靠。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多