【问题标题】:Tkinter active fill by tagTkinter 主动填充标签
【发布时间】:2018-11-27 23:02:58
【问题描述】:

我正在使用 Tkinter 设计一个 GUI 应用程序,对于这个项目,我需要菜单按钮。在查看按钮时,我并没有被按钮附带的自定义选项所震撼,尤其是当我发现您可以将单击参数绑定到矩形时。

这允许我以(几乎)无限的方式自定义“按钮”,但为了允许我在按钮上放置文本,我需要创建一个矩形元素和一个文本元素并使用 Tkinter 的 tag_bind 属性将它们绑定在一起.

我想要的按钮设计属性之一是当用户将鼠标悬停在元素上时主动填充。现在我只是使用activefill="",它可以工作,除了文本元素和按钮元素只会在鼠标悬停在 that 元素上时填充。因此,例如,当我将鼠标悬停在按钮上时,不包括文本的按钮将突出显示,反之亦然,当我将鼠标悬停在文本上时。

下面是我用来生成按钮的简化(为简洁起见)版本;

button = canvas.create_rectangle(button_width, button_height, 10, 10, fill="000", activefill="111", tags="test")
text = canvas.create_text((button_width/2), (button_height/2), activefill="111", tags="test")
canvas.tag_bind("test", "<Button-1>", "foo")

有没有办法将活动填充功能绑定到标签而不是特定元素?

另一种选择是我完全错过了有关在 Tkinter 中自定义按钮的大量信息,而且我不会反对学习这些。

【问题讨论】:

    标签: python user-interface tkinter


    【解决方案1】:

    选项 1

    我个人不会选择提出的解决方案。不知道你用的是tk还是ttk提供的按钮。但是,使用tkinter.tk,您完全可以更改按钮的外观。

    下面,我给你一个例子,它产生一个具有以下特征的按钮:

    • 蓝色前景
    • 扁平外观
    • 悬停时,背景为绿色
    • 按下时,背景为红色

    代码如下:

    import tkinter as tk
    
    root = tk.Tk()
    
    # Function hovering
    def on_enter(e):
        btn['background'] = 'green'
    
    def on_leave(e):
        btn['background'] = 'white'
    
    # Create the button
    btn = tk.Button(root, background='white', activebackground='red', foreground='blue',relief='flat',text='Test',width=20)
    btn.pack()
    
    # Bindings
    btn.bind("<Enter>", on_enter)
    btn.bind("<Leave>", on_leave)
    
    # Loop
    root.mainloop() 
    

    选项 2

    如果即使在尝试了tk.Button 之后,您对结果仍不满意,我会创建一个包含LabelFrame(您几乎可以使用该组合做任何事情)。然后,您可以根据任何用户操作更改框架的背景,例如:

    import tkinter as tk
    
    root = tk.Tk()
    
    # Function hovering
    def on_enter(e):
        lab['background'] = 'green'
    
    def on_leave(e):
        lab['background'] = 'white'
    
    # Click
    def on_click(e):
        print("hi")
    
    # Create the frame with a label inside
    fr = tk.Frame(root)
    lab = tk.Label(fr, text="Test", width=20, background="white")
    
    # Packing
    fr.pack()
    lab.pack()
    
    # Bindings
    fr.bind("<Enter>", on_enter)
    fr.bind("<Leave>", on_leave)
    lab.bind("<Button-1>", on_click)
    
    # Loop
    root.mainloop()
    

    您甚至可以使用上述组合创建一个类。

    【讨论】:

    • 好的,所以我完全不知道您可以自定义按钮。这是我需要的确切答案。谢谢!!
    猜你喜欢
    • 2020-09-24
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 2019-12-20
    • 2020-04-19
    • 1970-01-01
    相关资源
    最近更新 更多