透明背景上的 TKinter 按钮

2024-03-18

我试图了解如何将按钮应用到透明背景,同时保持其形状。当我生成下面的代码时,边框周围出现灰色背景,而且看起来也失去了形状。

使用的颜色

侧边栏:#2E3A4B 53%

按钮:#2C2F33 100%

from tkinter import *


def btn_clicked():
    """ Prints to console a message every time the button is clicked """
    print("Button Clicked")


root = Tk()

# Configures the frame, and sets up the canvas
root.geometry("1440x1024")
root.configure(bg="#ffffff")
canvas = Canvas(root, bg="#ffffff", height=1024, width=1440, bd=0, highlightthickness=0, relief="ridge")
canvas.place(x=0, y=0)

background_img = PhotoImage(file=f"background.png")
background = canvas.create_image(719.5, 512.5, image=background_img)

img0 = PhotoImage(file=f"img0.png")
alarm_button = Button(image=img0, borderwidth=0, highlightthickness=0, command=btn_clicked, relief="flat")

alarm_button.place(x=9, y=119, width=90, height=90)

root.resizable(False, False)
root.mainloop()

所需图片

外观如何:

它应该是什么样子:


好消息!我能够得到那个answer https://stackoverflow.com/a/70024912/355230 to a 相关问题 https://stackoverflow.com/questions/29857757/transparent-backgrounds-on-buttons-in-tkinter你发现工作了。为了更容易重用,我将其转换为正式的类并添加了一些方法。此外,我还让它在单击图像时关闭并重新打开图像,以便为用户提供一些视觉反馈,例如“真实的”tkinterButtons do.

请注意,它响应鼠标按钮<ButtonRelease-1>事件。在大多数情况下,这是比<Button-1>事件,因为如果用户意外按下按钮,他们可以将鼠标移离小部件图像以避免触发事件。

事实证明,使用 PIL 模块是不必要的。这是代码:

import tkinter as tk  # PEP 8 recommends avoiding `import *`.


class CanvasButton:
    """ Create leftmost mouse button clickable canvas image object.

    The x, y coordinates are relative to the top-left corner of the canvas.
    """
    flash_delay = 100  # Milliseconds.

    def __init__(self, canvas, x, y, image_path, command, state=tk.NORMAL):
        self.canvas = canvas
        self.btn_image = tk.PhotoImage(file=image_path)
        self.canvas_btn_img_obj = canvas.create_image(x, y, anchor='nw', state=state,
                                                      image=self.btn_image)
        canvas.tag_bind(self.canvas_btn_img_obj, "<ButtonRelease-1>",
                        lambda event: (self.flash(), command()))
    def flash(self):
        self.set_state(tk.HIDDEN)
        self.canvas.after(self.flash_delay, self.set_state, tk.NORMAL)

    def set_state(self, state):
        """ Change canvas button image's state.

        Normally, image objects are created in state tk.NORMAL. Use value
        tk.DISABLED to make it unresponsive to the mouse, or use tk.HIDDEN to
        make it invisible.
        """
        self.canvas.itemconfigure(self.canvas_btn_img_obj, state=state)


BGR_IMG_PATH = "sunset_background.png"
BUTTON_IMG_PATH = "alarm_button.png"

def btn_clicked():
    """ Prints to console a message every time the button is clicked """
    print("Button Clicked")

root = tk.Tk()

background_img = tk.PhotoImage(file=BGR_IMG_PATH)
bgr_width, bgr_height = background_img.width(), background_img.height()

root.geometry(f'{bgr_width}x{bgr_height}')
root.title("TKinter button over transparent background")
root.configure(bg="white")

canvas = tk.Canvas(root, bg="white", height=bgr_height, width=bgr_width, bd=0,
                   highlightthickness=0, relief="ridge")
canvas.place(x=0, y=0)

background = canvas.create_image(0, 0, anchor='nw', image=background_img)

canvas_btn1 = CanvasButton(canvas, 0, 128, BUTTON_IMG_PATH, btn_clicked)
canvas_btn2 = CanvasButton(canvas, 0, 256, BUTTON_IMG_PATH, btn_clicked)

root.resizable(False, False)
root.mainloop()

结果截图:

特写:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

透明背景上的 TKinter 按钮 的相关文章

随机推荐

  • 从 Java 内部编译外部 .java 文件

    我正在制作一个工具 可以编写 java 文件 然后 希望 将这些文件编译为 class 文件 在整个过程中 用户选择写入多个 java 文件的文件目录 现在我想让程序编译这些Java文件 JavaCompiler是你的朋友 检查文档here
  • 相当于 az acr login 的 powershell 是什么

    使用powershell我们如何登录Azure容器注册表 提供的示例仅适用于 Azure CLI az acr login name
  • Pycharm 在相对路径中看不到带有 ../ 的文件

    我正在使用 pycharm 开发一个 python 项目 但是 问题是它拒绝加载相对路径包含的文件 当我尝试时 self image pygame image load resources img prey png convert alph
  • 在winRT MessageDialog中添加文本框

    我正在 Windows 8 商店应用程序中工作 我试图弹出一个对话框 让用户在文本框中输入信息 怎么做 The InputDialog http winrtxamltoolkit codeplex com SourceControl cha
  • Maven 检查样式作为构建的一部分

    如果存在一些问题 是否有可能以某种方式强制 Maven 使构建失败checkstyle错误 现在我必须跑site目标生成javadocs and checkstyle报告 我想成功install目标 如果 checkstyle 有一些错误
  • Yii - ajax 加载的表单元素的用户端验证

    我在静态表单中使用 Yii 用户端验证 这非常棒 但我不知道如何为 ajax 加载的元素添加验证器 我有一个简单的表单小部件 我想通过 AJAX 加载更多的输入字段 对于小型 jQuery 脚本来说这不是问题 但我不知道如何为加载的元素添加
  • WPF 中的进度条样式是老式的。酒吧增量。如何实现带有vista或windows-7阴影发光效果的进度条?

    WPF 中的进度条样式是老式的 酒吧增量 如何实现带有 vista 或 windows 7 阴影发光效果的进度条 图片http quickshare my3gb com download 2 JPG http quickshare my3g
  • C 指针和内存分配:Realloc 数组和指针传递

    对于那些有 C 经验的人来说 这将是一个简单的内存分配 引用问题 这是我的数据结构 struct configsection char name unsigned int numopts configoption options typed
  • 有没有办法用 Moq 来一般模拟 DbSet.Find 方法?

    我目前正在使用扩展方法来将 DbSets 一般模拟为列表 public static DbSet
  • CSV 未附加到应用程序电子邮件中?

    所以我有一段时间遇到这个问题但无法让它工作 我一直在构建一个调查应用程序 用户只需在其中输入信息并将其保存到 csv 文件中 我现在正处于需要将应用程序内的 csv 文件附加到电子邮件地址的阶段 我刚刚在我的新手机上测试了这个 收到电子邮件
  • 在 ipython 笔记本中测量单元执行时间的简单方法

    除了单元的原始输出之外 我还想获取单元执行所花费的时间 为此 我尝试了 timeit r1 n1但它不会公开单元格内定义的变量 time适用于仅包含 1 条语句的单元格 In 1 time 1 CPU times user 4 s sys
  • 为什么 UITableView 单元格在滚动时重叠?

    我有一个UITableView大约有 100 行 每个单元格都检查了图像 但是当我们滚动时UITableView 所有单元格在未检查的单元格中重叠 UITableViewCell tableView UITableView tableVie
  • 重载new和delete

    我尝试遵循这篇文章 http flipcode com archives How To Find Memory Leaks shtml http flipcode com archives How To Find Memory Leaks
  • 相对URL问题

    我将有多个文件夹 模块来访问常用文件 但访问它们对我来说似乎很重要 我确实通过这个链接来了解相对定位并设法解决了一些问题 但不是所有的 参考 php 中的相对 URL 路径 https stackoverflow com questions
  • IOS - 如果用户点击随机元素而不是背景,如何隐藏键盘?

    在我的应用程序中我有这样的东西 IBAction backgroundTouch id sender businessDescription resignFirstResponder self view endEditing YES 我不确
  • 如何使用 C# 读取 XML 元素的内容? [复制]

    这个问题在这里已经有答案了 可能的重复 解析 xml 文件的最佳实践 https stackoverflow com questions 55828 best practices to parse xml files 我希望能够在 XML
  • Spring WebFlux 创建无阻塞线程池

    我决定用 Java 重写我的 Web 应用程序 之前是用 Python 编写的 在我的应用程序中 我使用了无阻塞 I O 我有工作池 Celery Eventlet 线程 我在其中传递由数百个 API 调用组成的任务 现在我正在使用Spri
  • 如何使用 Process.Start 启动管道并重定向命令?

    我正在使用 System Diagnostics Process Start 在 Linux 操作系统上远程启动命令 到目前为止 我已经能够启动简单的命令 然后读取输出 例如我可以执行命令echo Hello World并阅读Hello W
  • 跨线程操作错误

    if listBox1 InvokeRequired listBox new StringBuilder this listBox1 Text 这是 c 中的代码 执行时会对 listBox1 产生无效的跨线程操作错误 listBox1 是
  • 透明背景上的 TKinter 按钮

    我试图了解如何将按钮应用到透明背景 同时保持其形状 当我生成下面的代码时 边框周围出现灰色背景 而且看起来也失去了形状 使用的颜色 侧边栏 2E3A4B 53 按钮 2C2F33 100 from tkinter import def bt