【问题标题】:Multiple images in a ttk label widgetttk 标签小部件中的多个图像
【发布时间】:2026-01-05 05:55:02
【问题描述】:

使用 ttk 标签,可以指定根据标签状态显示的多个图像。但我不能让它工作。这是代码。

from tkinter import *
from tkinter.ttk import *

BITMAP0 = """
#define zero_width 24
#define zero_height 32
static char zero_bits[] = {
0x00,0x00,0x00, 0x00,0x00,0x00, 0xf0,0x3c,0x0f, 0xf0,0x3c,0x0f,
0xf0,0x3c,0x0f, 0xf0,0x3c,0x0f, 0x00,0x00,0x00, 0x00,0x00,0x00,
0xf0,0x00,0x0f, 0xf0,0x00,0x0f, 0xf0,0x00,0x0f, 0xf0,0x00,0x0f,
0x00,0x00,0x00, 0x00,0x00,0x00, 0xf0,0x00,0x0f, 0xf0,0x00,0x0f,
0xf0,0x00,0x0f, 0xf0,0x00,0x0f, 0x00,0x00,0x00, 0x00,0x00,0x00,
0xf0,0x00,0x0f, 0xf0,0x00,0x0f, 0xf0,0x00,0x0f, 0xf0,0x00,0x0f,
0x00,0x00,0x00, 0x00,0x00,0x00, 0xf0,0x3c,0x0f, 0xf0,0x3c,0x0f,
0xf0,0x3c,0x0f, 0xf0,0x3c,0x0f, 0x00,0x00,0x00, 0x00,0x00,0x00
};
"""

BITMAP1 = """
#define one_width 24
#define one_height 32
static char one_bits[] = {
0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x0f, 0x00,0x00,0x0f,
0x00,0x00,0x0f, 0x00,0x00,0x0f, 0x00,0x00,0x00, 0x00,0x00,0x00,
0x00,0x00,0x0f, 0x00,0x00,0x0f, 0x00,0x00,0x0f, 0x00,0x00,0x0f,
0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x0f, 0x00,0x00,0x0f,
0x00,0x00,0x0f, 0x00,0x00,0x0f, 0x00,0x00,0x00, 0x00,0x00,0x00,
0x00,0x00,0x0f, 0x00,0x00,0x0f, 0x00,0x00,0x0f, 0x00,0x00,0x0f,
0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x0f, 0x00,0x00,0x0f,
0x00,0x00,0x0f, 0x00,0x00,0x0f, 0x00,0x00,0x00, 0x00,0x00,0x00
};
"""

root = Tk()
img0 = BitmapImage(data=BITMAP0, foreground='lime', background='black')
img1 = BitmapImage(data=BITMAP1, foreground='lime', background='black')
label = Label(root, image=(img0, 'active', img1))
label.pack()

当鼠标经过标签时,标签是“活动的”。因此,当鼠标经过时,显示的数字应该从 0 切换到 1。但它不起作用。 有什么帮助吗? Python 3.5.1 / Windows Vista

【问题讨论】:

    标签: python tkinter label ttk


    【解决方案1】:

    我发现文档有点混乱,但您似乎想要 'hover' 而不是 'active'

    我不知道有任何来源解释在哪些条件下自动设置哪些状态标志。我在这里所做的是将鼠标光标放在标签上,然后通过调用label.state() 来查询状态。

    【讨论】:

    • ttk 小部件的状态列表在这里:infohost.nmt.edu/tcc/help/pubs/tkinter/web/ttk-map.html,ttk.Label 小部件的图像选项文档在这里:infohost.nmt.edu/tcc/help/pubs/tkinter/web/ttk-Label.html
    • @Jal 我应该写“可靠和完整的来源”。但是使用'hover' 而不是'active' 对你有用吗?
    • 不,hoover 似乎不是有效的 ttk 小部件状态 _tkinter.TclError: Invalid state name hoover。使用label.bind("<Enter>", enter)label.bind("<Leave>", leave) 可以解决我的问题,但我想了解为什么Label(root, image=(img0, 'active', img1)) 不能按预期工作。感谢您的关注。
    • @Jal 不是'hoover',而是'hover'
    【解决方案2】:

    ttk.Label 似乎不接受状态。但是,进入/退出绑定确实适用于样式配置设置。输出为绿色的 0/1。

    import tkinter as tk
    import tkinter.ttk as ttk
    
    def Limg1(*args):
      s.configure('zL1.TLabel', image=img1)
    
    def Limg0(*args):
      s.configure('zL1.TLabel', image=img0)
    
    root = tk.Tk()
    s = ttk.Style()
    s.theme_use("classic") #3D/Color-alt/classic/default, Color-clam). 
    
    BITMAP0 = """
    #define zero_width 24
    #define zero_height 32
    static char zero_bits[] = {
    0x00,0x00,0x00, 0x00,0x00,0x00, 0xf0,0x3c,0x0f, 0xf0,0x3c,0x0f,
    0xf0,0x3c,0x0f, 0xf0,0x3c,0x0f, 0x00,0x00,0x00, 0x00,0x00,0x00,
    0xf0,0x00,0x0f, 0xf0,0x00,0x0f, 0xf0,0x00,0x0f, 0xf0,0x00,0x0f,
    0x00,0x00,0x00, 0x00,0x00,0x00, 0xf0,0x00,0x0f, 0xf0,0x00,0x0f,
    0xf0,0x00,0x0f, 0xf0,0x00,0x0f, 0x00,0x00,0x00, 0x00,0x00,0x00,
    0xf0,0x00,0x0f, 0xf0,0x00,0x0f, 0xf0,0x00,0x0f, 0xf0,0x00,0x0f,
    0x00,0x00,0x00, 0x00,0x00,0x00, 0xf0,0x3c,0x0f, 0xf0,0x3c,0x0f,
    0xf0,0x3c,0x0f, 0xf0,0x3c,0x0f, 0x00,0x00,0x00, 0x00,0x00,0x00
    };
    """
    
    BITMAP1 = """
    #define one_width 24
    #define one_height 32
    static char one_bits[] = {
    0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x0f, 0x00,0x00,0x0f,
    0x00,0x00,0x0f, 0x00,0x00,0x0f, 0x00,0x00,0x00, 0x00,0x00,0x00,
    0x00,0x00,0x0f, 0x00,0x00,0x0f, 0x00,0x00,0x0f, 0x00,0x00,0x0f,
    0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x0f, 0x00,0x00,0x0f,
    0x00,0x00,0x0f, 0x00,0x00,0x0f, 0x00,0x00,0x00, 0x00,0x00,0x00,
    0x00,0x00,0x0f, 0x00,0x00,0x0f, 0x00,0x00,0x0f, 0x00,0x00,0x0f,
    0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x0f, 0x00,0x00,0x0f,
    0x00,0x00,0x0f, 0x00,0x00,0x0f, 0x00,0x00,0x00, 0x00,0x00,0x00
    };
    """
    
    img0 = tk.BitmapImage(data=BITMAP0, foreground='lime', background='black')
    img1 = tk.BitmapImage(data=BITMAP1, foreground='lime', background='black')
    
    s.configure('zL1.TLabel', image=img0)
    
    label = ttk.Label(root, style='zL1.TLabel')
    label.grid(column=0,row=0,sticky='nsew');
    
    label.bind('<Enter>',Limg1);
    label.bind('<Leave>',Limg0);
    root.mainloop()
    

    【讨论】:

      最近更新 更多