Tkinter:模糊的透明背景帧

Posted

技术标签:

【中文标题】Tkinter:模糊的透明背景帧【英文标题】:Tkinter: Blurry transparent background frames 【发布时间】:2018-04-06 15:30:49 【问题描述】:

我正在编写一个使用 tkinter 的 Python 应用程序,并且我试图让它看起来更像新的 W10 应用程序。 使用 tkinter,我可以使用 bg 将图像应用为框架背景或纯色,甚至可以使用 alpha 使框架或整个窗口透明。 为了使 UI 看起来更好,我删除了带有此参数 borderwidth=0,highlightthickness = 0, bd = 0 的按钮边框。 但我还没有找到任何东西来制作模糊的透明框架背景。与航空或新的 W10 应用程序相同。 使用alpha,我可以更改不透明度,但不能更改模糊。 有什么方法可以让我的应用程序看起来像我描述的那样?

【问题讨论】:

您可以在将图像添加到框架之前使图像模糊。 @Nae 我想要的是一个模糊的透明背景,类似于航空效果。不是静态的模糊背景。 Tkinter : Create blur transparency的可能重复 不幸的是,Tkinter 不提供此功能。 (据我所知) 我不太了解任何其他 GUI 工具来向您展示如何操作,而且我不使用 Windows。但我认为 Qt 应该可以做到这一点(***.com/questions/19383427/… 这是 c++,但必须有一种方法可以用 PyQt 做同样的事情),我建议你不要混合使用几个 GUI 工具包。 【参考方案1】:

你不能真正做到,但你肯定可以伪造它,正如@PyGuy 所证明的那样。 但是,我的短代码是纯 Tkinter 和 pyautogui,如果您像我一样不熟悉 kivy,这可能会有所帮助。

import ctypes
import pyautogui
from tkinter import *
from PIL import ImageTk, ImageFilter, ImageEnhance
import tkinter as tk
ctypes.windll.shcore.SetProcessDpiAwareness(1)
root =tk.Tk()
root.geometry("1500x1200")

frame=Frame(root)
x = 3
y = 37
ss = pyautogui.screenshot(region=(x, y, 1950, 1200))
blurImage = ss.filter(ImageFilter.GaussianBlur(radius = 20))
filter=ImageEnhance.Brightness(blurImage)
brightImage=filter.enhance(0.8)
brightImage = brightImage.filter(ImageFilter.SMOOTH_MORE())
ss = ImageTk.PhotoImage(brightImage)
root.state('zoomed')
image1 = Label(frame, image=ss)
image1.image = ss
image1.place(x=0, y=0)
frame.config(bg="white")
frame.pack(expand="true", fill=BOTH)
root.state('zoomed')

root.mainloop()

【讨论】:

【参考方案2】:

嗯,这在tkinter 中是完全不可能的,但等等,我并不是说不可能。

您只需要执行以下操作-

注意:仅当您在没有边框的全屏窗口中使用您的应用时,这才有效。

让我们看看如何-我将使用KIVY所以请下载它。

如果您有kivy,请跳过此kivy 安装指南:

记住:Kivy 仅在 python 2.7、3.7 和 3.4 中受支持,所以 卸载 如果任何版本不匹配,您将拥有 python。要知道当前 python version 在cmd中输入'python version'。

步骤 1)。在 cmd 中输入“pip install kivy”

步骤 2)。安装过程中可能会出现问题,所以我说卸载不支持的python版本。

1)。以下软件包是必需的,如果您没有,请下载它们。

PILpip install PIL pyautogui pip install pyautogui

2)。说明:在Python中,有点难用 DWM(桌面窗口管理器)API,有助于模糊后面的窗口。然而, 在 C++ 中,有一个名为 EnableBlurBehind() 的内置函数可以使用 DWM API 模糊后面的窗口。

首先,我们将使用pyautogui 包进行截图 然后模糊图像(屏幕截图或背景) 最后,在画布中设置图片。

瞧!你把后面的窗户弄模糊了。因此,让我们让这个概念发挥作用。

仅当您下载了所需的库后,才复制并粘贴到 IDE 中

主要python文件,另存为name.py
# first take the screenshot else problem will occur
import pyautogui
# take screenshot
screenshot = pyautogui.screenshot()
screenshot.save('screenshot.png')

# import other required libraries
from PIL import Image, ImageFilter
from kivy.app import App
from kivy.core.window import Window
from kivy.uix.widget import Widget
from PIL import Image, ImageFilter
from win32api import GetSystemMetrics
from kivy.animation import Animation


# set window size
Window.borderless = True
Window.size = GetSystemMetrics(0), GetSystemMetrics(1)
Window.left = 0
Window.top = 0


class Blur(Widget):

    # Transparent Blur Window Exmple the screenshot
    get_image = Image.open('screenshot.png')
    blur_image = get_image.filter(ImageFilter.GaussianBlur(radius=15))
    blur_image.save('blured.png')

    def anim(self):
        animator = Animation(x=1800, y=500)
        animator.start(self.ids.animate)


class Build(App):
    def build(self):
        return Blur()


Build().run()
KV Language file 另存为build.kv 否则无效
<Blur>:
    canvas.before:
        Rectangle:
            pos: self.pos
            size: self.size
            source: 'blured.png'
    Button:
        id: animate
        text: 'Here, you can add anything you want now. Click me!'
        bold: True
        italic: True
        pos: 700, 500
        font_size: 25
        size: 400, 300
        background_color: 0,0,0,0
        on_press: root.anim()

如果您不知道如何在 IDE 中打开 file.kv,请搜索它。解决您遇到的任何非常规问题。

【讨论】:

【参考方案3】:

不幸的是,这个服务在 tkinter 中是一个争论的问题,它不是由它提供的。不过,您可以访问here 了解如何在您的应用中使用高斯模糊方法。

【讨论】:

以上是关于Tkinter:模糊的透明背景帧的主要内容,如果未能解决你的问题,请参考以下文章

Tkinter Python透明背景与(不透明)可见形状?

使用透明背景、ttk 框架背景颜色配置 tkinter/ttk 小部件?

Tkinter:将具有透明背景的图像添加到按钮

背景在具有 counter-tkinter 的单独窗口中透明

tkinter如何将一个部件透明??

在jframe中的模糊背景上创建一个透明矩形