如何使Overredirect窗口像Tkinter Python中的普通窗口一样工作(例如,在任务栏中显示,添加最小化按钮)

2024-04-29 05:41:38 发布

您现在位置:Python中文网/ 问答频道 /正文

my window image 经过一些研究后,我在特金特制作了一个圆角窗口

from tkinter import *
from tkinter.ttk import Style,Frame as fp
root = Tk()
root.geometry("600x400+250+250")
root.overrideredirect(True)
root.wm_attributes("-transparentcolor", "#d307e9")
root.wm_attributes("-topmost", True)
#This is made with ttkframe from image and the image is in base64 encoded fromat
data='''
        iVBORw0KGgoAAAANSUhEUgAAAEAAAAAvCAYAAABTy8x
        RAAACxElEQVRoge2aS2/aQBSFs+NRCEkVhUJfolISNW
        nSllcIeF91lT6WqdT8gK6y6+/Exobwsne2MWA8+9NFk
        1SEAY3Nyx66OCsk5Ptp7twz996takjHJmtr3R+wbv0H
        sLA/i+iQEibk/R6UtIX6Cwv1V/359dyCkrIg7/UgxQ1
        Uwz4BIEYN1F9aaL+3oZYdaAJZjSoEaslB63gIJWnNDc
        Q1AGnHROeDvbqAGYA0j4YQo8ZyAYgRHe1THwVOAdHI9
        JcDQEqYUC9WeMznUCc7ghhZIIDargmtsv7A3KhbcJgh
        zAQgxQ1oZYKb4m9cFa5xVfh5p2v8eCQ//f6reINOdsR
        0QU4HENbRLf499pf5b8jlcoHRp/xnaAJB83DoHcBtpv
        9wpIIKQBMIagnTPQAxaozlfZABdLIj9wAamcHYpXKZ/
        7r2oLwC0AQCaXu6R6ACeFzygg6g9Xb6XTABQIwZE2Ul
        yCmgCQRqmbADaLzucwdAEwjEGD0NJgDQ7C4PAJRnFhs
        AmuXlAcA0TzAOIKxTbS8PANpnNgOACL8AugW6HxgDIE
        Z06uOCBwBqydlwAFNKISOAYBshTSDQKnMBCP4J2HgAc
        6YABwBYLkG+yyALgI03Qjxb4SMWKxzS0T7j9DGUYnwM
        8focllifw2Kc1hAJthFy1RCh3QNBB9A6dtESq4ZoTdF
        gp4C0Pb01Tm+LRzhqi3/00BavhvgZjEheBiP3pqhbCP
        ho7GAwM/jZAEL/hqNf8t/XHpRbAJ3cvMPRO9V2TGjlS
        XvsZ3XzI1QXMR5/OAkxA+p5MBYk2qe2q70h9h2hsI7m
        4dC3yxJqmUBJ0+3uYgDcl8iYgdaJ7RsQ6oWD2zcDz9t
        i3vcEwzrkZA/tdzbUkrM6IBUC9dxB82CA2u7sErdcAB
        QgUtyAvNeDnOxBSVlQ0gtQyoK830PtqQnxiY8WJXnRx
        gP4AyU7Jb13S9JyAAAAAElFTkSuQmCC
'''
FrameImage = PhotoImage("border", data=data,master=root)
T_style=Style()
T_style.element_create("RoundedFrame",
                     "image", FrameImage,
                     border=20, sticky="nsew")
T_style.layout("RoundedFrame",
                         [("RoundedFrame", {"sticky": "nsew"})])

t = fp(root,style="RoundedFrame", padding=10)
t.pack(fill='both',expand=True)
f=Frame(t,width=581,height=25,bg='red')
f.place(x=-1,y=0)

def loop1(evt):
    global xp,yp
    xp=evt.x
    yp=evt.y
def loop2(evt):
    global xp,yp
    xp=None
    yp=None
def loop(evt):
    deltax=evt.x-xp
    deltay=evt.y-yp
    x=root.winfo_x()+deltax
    y=root.winfo_y()+deltay
    root.geometry(f"+{x}+{y}")
f.bind('<B1-Motion>',loop)
f.bind('<ButtonPress-1>',loop1)
f.bind('<ButtonRelease-1>',loop2)
def minm():
    root.overrideredirect(False)
    root.iconify()
    root.update_idletasks()
b=Button(t,text='minimize',command=minm).pack()
def good(event):
    root.overrideredirect(True)
    
root.bind("<Map>",good)
root.mainloop()

但我无法通过按钮最小化它,而且在运行时它甚至不会出现在windows任务栏中。但是在对stackoverflow网站进行了一些研究之后,我成功地管理了这个可移动窗口。我希望它能像普通窗口一样工作。 任何帮助都将不胜感激。 谢谢大家!

I want this type in the taskbar of window


Tags: fromimagetruedatabindstyletkinterdef
1条回答
网友
1楼 · 发布于 2024-04-29 05:41:38

您可以使用Toplevel窗口(在屏幕可视区域中不可见)在任务栏中假装root窗口。然后基于此不可见Toplevel窗口的MapUnmap事件来显示或隐藏root窗口

以下是基于您的修改程序:

from tkinter import *
from tkinter.ttk import Style, Frame as fp

root = Tk()

def toggle(event):
    if event.type == EventType.Map:
        root.deiconify()
    else:
        root.withdraw()

# create the "invisible" toplevel
top = Toplevel(root)
top.geometry('0x0+10000+10000') # make it not visible
top.protocol('WM_DELETE_WINDOW', root.destroy) # close root window if toplevel is closed
top.bind("<Map>", toggle)
top.bind("<Unmap>", toggle)

root.geometry("600x400+250+250")
root.overrideredirect(True)
root.wm_attributes("-transparentcolor", "#d307e9")
root.wm_attributes("-topmost", True)

#This is made with ttkframe from image and the image is in base64 encoded fromat
data='''
        iVBORw0KGgoAAAANSUhEUgAAAEAAAAAvCAYAAABTy8x
        RAAACxElEQVRoge2aS2/aQBSFs+NRCEkVhUJfolISNW
        nSllcIeF91lT6WqdT8gK6y6+/Exobwsne2MWA8+9NFk
        1SEAY3Nyx66OCsk5Ptp7twz996takjHJmtr3R+wbv0H
        sLA/i+iQEibk/R6UtIX6Cwv1V/359dyCkrIg7/UgxQ1
        Uwz4BIEYN1F9aaL+3oZYdaAJZjSoEaslB63gIJWnNDc
        Q1AGnHROeDvbqAGYA0j4YQo8ZyAYgRHe1THwVOAdHI9
        JcDQEqYUC9WeMznUCc7ghhZIIDargmtsv7A3KhbcJgh
        zAQgxQ1oZYKb4m9cFa5xVfh5p2v8eCQ//f6reINOdsR
        0QU4HENbRLf499pf5b8jlcoHRp/xnaAJB83DoHcBtpv
        9wpIIKQBMIagnTPQAxaozlfZABdLIj9wAamcHYpXKZ/
        7r2oLwC0AQCaXu6R6ACeFzygg6g9Xb6XTABQIwZE2Ul
        yCmgCQRqmbADaLzucwdAEwjEGD0NJgDQ7C4PAJRnFhs
        AmuXlAcA0TzAOIKxTbS8PANpnNgOACL8AugW6HxgDIE
        Z06uOCBwBqydlwAFNKISOAYBshTSDQKnMBCP4J2HgAc
        6YABwBYLkG+yyALgI03Qjxb4SMWKxzS0T7j9DGUYnwM
        8focllifw2Kc1hAJthFy1RCh3QNBB9A6dtESq4ZoTdF
        gp4C0Pb01Tm+LRzhqi3/00BavhvgZjEheBiP3pqhbCP
        ho7GAwM/jZAEL/hqNf8t/XHpRbAJ3cvMPRO9V2TGjlS
        XvsZ3XzI1QXMR5/OAkxA+p5MBYk2qe2q70h9h2hsI7m
        4dC3yxJqmUBJ0+3uYgDcl8iYgdaJ7RsQ6oWD2zcDz9t
        i3vcEwzrkZA/tdzbUkrM6IBUC9dxB82CA2u7sErdcAB
        QgUtyAvNeDnOxBSVlQ0gtQyoK830PtqQnxiY8WJXnRx
        gP4AyU7Jb13S9JyAAAAAElFTkSuQmCC
'''

FrameImage = PhotoImage("border", data=data, master=root)
T_style = Style()
T_style.element_create("RoundedFrame", "image", FrameImage,
                       border=20, sticky="nsew")
T_style.layout("RoundedFrame",
                [("RoundedFrame", {"sticky": "nsew"})])

t = fp(root, style="RoundedFrame", padding=10)
t.pack(fill='both', expand=True)

f = Frame(t, width=581, height=25, bg='red')
f.place(x=-1, y=0)

def on_mouse_press(evt):
    global xp, yp
    xp = evt.x
    yp = evt.y

def on_mouse_drag(evt):
    deltax = evt.x - xp
    deltay = evt.y - yp
    x = root.winfo_x() + deltax
    y = root.winfo_y() + deltay
    root.geometry(f"+{x}+{y}")

f.bind('<B1-Motion>', on_mouse_drag)
f.bind('<ButtonPress-1>', on_mouse_press)

# simulate close button in normal title bar
Button(t, text='X', width=1, command=root.destroy).pack(side=RIGHT, anchor='n')
# simulate minimize button in normal title bar
Button(t, text='_', width=1, command=top.iconify).pack(side=RIGHT, anchor='n')

root.mainloop()

相关问题 更多 >