Tkinter,Windows:如何查看没有标题栏的Windows任务栏中的窗口?

Fam*_*tor 6 python windows tkinter python-3.4

我创建了一个窗口:

root = Tk()
Run Code Online (Sandbox Code Playgroud)

并删除标题栏:

root.overrideredirect(True)
Run Code Online (Sandbox Code Playgroud)

现在窗口不在Windows的任务栏上.如何在任务栏中显示它?(如果其他窗户在我的上面,我只想把窗户拉到前面)

pat*_*yts 7

Tk没有提供一种方法来拥有一个顶层窗口,该窗口的overrideredirect设置显示在任务栏上.要执行此操作,窗口需要应用WS_EX_APPWINDOW扩展样式,并且此类型的Tk窗口设置为WS_EX_TOOLWINDOW.我们可以使用python ctypes扩展来重置它,但是我们需要注意Windows上的Tk顶层窗口不是由窗口管理器直接管理的.因此,我们必须将此新样式应用于该winfo_id方法返回的窗口的父级.

以下示例显示了这样一个窗口.

import tkinter as tk
import tkinter.ttk as ttk
from ctypes import windll

GWL_EXSTYLE=-20
WS_EX_APPWINDOW=0x00040000
WS_EX_TOOLWINDOW=0x00000080

def set_appwindow(root):
    hwnd = windll.user32.GetParent(root.winfo_id())
    style = windll.user32.GetWindowLongPtrW(hwnd, GWL_EXSTYLE)
    style = style & ~WS_EX_TOOLWINDOW
    style = style | WS_EX_APPWINDOW
    res = windll.user32.SetWindowLongPtrW(hwnd, GWL_EXSTYLE, style)
    # re-assert the new window style
    root.wm_withdraw()
    root.after(10, lambda: root.wm_deiconify())

def main():
    root = tk.Tk()
    root.wm_title("AppWindow Test")
    button = ttk.Button(root, text='Exit', command=lambda: root.destroy())
    button.place(x=10,y=10)
    root.overrideredirect(True)
    root.after(10, lambda: set_appwindow(root))
    root.mainloop()

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)