在Python中显示透明且没有背景或窗口的图像

Joh*_*ohn 5 python wxpython tkinter tkinter-canvas

我试图在屏幕上显示图像,而不弹出/包含任何窗口/应用程序。我对 TKinter 非常熟悉,但删除画布背景颜色的方法很糟糕,并且会产生一些不良效果。

import tkinter as tk
import ctypes
user32 = ctypes.windll.user32
screen_size = user32.GetSystemMetrics(0), user32.GetSystemMetrics(1)

root = tk.Tk()

root.overrideredirect(True)
root.config(bg="blue", bd=0, highlightthickness=0)
root.attributes("-transparentcolor", "#FEFCFD")
root.attributes("-topmost", True)

tk_img = tk.PhotoImage(file="image.png")

canvas = tk.Canvas(root, bg="#FEFCFD", bd=0, highlightthickness=0, width=screen_size[0], height=screen_size[1])
canvas.pack()

img = canvas.create_image(0, 0, image=tk_img, anchor="nw")

root.mainloop()
Run Code Online (Sandbox Code Playgroud)

-transparentcolor标志主要删除背景,但如果图像有任何部分透明的像素,它会给它们着色。另外,如果图像中存在该颜色,它将被删除;这种颜色的选择是希望最大限度地减少图像中的精确匹配,同时也以白色为主,希望对图像产生最不明显的影响。这是它当前的样子;非常接近我想要的,但是您可以在骰子的白色区域中看到一些丢失的像素,并且由于它们的边缘部分透明,它们周围似乎都有白色边框。这就是图像应该的样子。

我也尝试过使用 wxPython 来实现这种效果,但我无法删除窗口的背景,导致透明图像总是由某种颜色支持。我用了这个答案;我稍微修改了它,但我所做的一切都没有改善它。

那么,有没有一种方法可以用Python在屏幕上绘制完全没有背景的图像呢?

Joh*_*ohn 5

感谢 Kartikeya 的建议,我能够解决我自己的问题。

使用 PyQt5,此代码将显示透明且完全没有边框或背景的图像

import sys

from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QMainWindow, QApplication, QLabel

app = QApplication(sys.argv)

window = QMainWindow()

window.setAttribute(Qt.WA_TranslucentBackground, True)
window.setAttribute(Qt.WA_NoSystemBackground, True)
window.setWindowFlags(Qt.FramelessWindowHint)

label = QLabel(window)
pixmap = QPixmap('image.png')
label.setPixmap(pixmap)
label.setGeometry(0, 0, pixmap.width(), pixmap.height())

window.label = label

window.resize(pixmap.width(),pixmap.height())

window.show()
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)

有一次我在寻找PyQt5时,发现了这个问题,只需要稍微修改一下代码即可。这是现在的样子。