如何使 Overredirect window 在 Tkinter Python 中正常工作(eg.Show 在任务栏中,添加最小化按钮)正常 window
How to make Overredirect window work like(eg.Show in Taskbar,Add Minimize Button) normal window in Tkinter Python
my window image 经过一些研究,我在 tkinter 中做了一个圆角 window。
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 任务栏中,而 running.but 在对 Whosebug 网站进行了一些研究后,我成功地管理了这个 window moveable.I 希望它能正常工作 window。
任何帮助将不胜感激。
谢谢!
I want this type in the taskbar of window
你可以用一个Toplevel
window(在屏幕可视区域不可见)在任务栏中伪装成root
window。然后根据这个invisible的Map
或者Unmap
事件Toplevel
window显示或者隐藏root
window.
下面是根据你的修改后的程序:
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()
my window image 经过一些研究,我在 tkinter 中做了一个圆角 window。
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 任务栏中,而 running.but 在对 Whosebug 网站进行了一些研究后,我成功地管理了这个 window moveable.I 希望它能正常工作 window。 任何帮助将不胜感激。 谢谢!
I want this type in the taskbar of window
你可以用一个Toplevel
window(在屏幕可视区域不可见)在任务栏中伪装成root
window。然后根据这个invisible的Map
或者Unmap
事件Toplevel
window显示或者隐藏root
window.
下面是根据你的修改后的程序:
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()