为什么当 运行 作为 .exe(通过 pyinstaller 创建)时 tkinter GUI 的行为不同?

Why does a tkinter GUI behave differently when run as an .exe (created via pyinstaller)?

我有一个使用 tkinter 创建的透明 GUI。

import tkinter as tkinter 

class TransparentWindow(tkinter.Frame):

    def __init__(self, master = None):

         # Initialize the mainframe and declare the master
        tkinter.Frame.__init__(self, master)

        # Make the window transparent
        transparent = self.set_transparent_color(
            window = self.master,
            color = "yellow"
            )
        self.master["bg"] = transparent

        self.master.wm_attributes("-topmost", True)

    def set_transparent_color(self, window, color):
        """
        Mark a sacraficial color as transparent for a window.
        """
        window.wm_attributes(
            "-transparentcolor",
            color
            )
        return color


# Create window
root_window = tkinter.Tk()
TransparentWindow(root_window)
root_window.mainloop()

当我 运行 这是一个 .py 文件时, window 出现并保持在所有其他 windows 之上(由于 -topmost 属性) .这个window可以“点进去”。也就是说,你可以在window里面点击,和它后面的直接window进行交互。透明 window 将失去焦点,但仍保持在另一个 window.

之上

现在,当此代码通过 pyinstaller 命令编译成可执行文件时:pyinstaller --onefile -w script_name.py 并且该可执行文件是 运行,透明的 window 不会失去焦点如果你点击里面。

为什么 运行 与 .py.exe 相同的代码会像这样改变焦点的行为?这是 pyinstaller 的事情,还是 tkinter GUI 出于某种原因必然表现不同?

以下内容已在版本 4.2 中通过提交 3c3228d. The issue persists if icon is set to NONE, currently reported as a bug 修复。此问题以及出现的其他问题可能会在不久的将来得到解决。

使用以下命令更新pyinstaller

pip install --upgrade pyinstaller