python tkinter 恢复 window 没有标题栏
python tkinter restore window without title bar
我有一个 tkinter
window,我从中删除了标题栏并添加了自定义关闭和最小化按钮。当程序首次加载时,它不会在任务栏上显示图标。当我单击自定义的最小化按钮时,它会在任务栏上创建一个图标;但是,当我单击恢复 window 时,我无法再次摆脱标题栏。
我希望图标始终显示在任务栏上,当程序最小化然后恢复时,我希望标题栏仍然从 .overrideredirect(1)
中消失。不幸的是,在不使任务栏图标消失的情况下,我无法在最小化前后重置标志。
请让我知道我做错了什么。谢谢!
#!/usr/bin/python3
from tkinter import *
import tkinter as tk
import datetime
import time
import math
root = tk.Tk()
root.overrideredirect(1)
def close():
root.destroy()
def minimizeWindow():
root.withdraw()
root.overrideredirect(False)
root.iconify()
root.resizable(False, False)
canvas = Canvas(root, width = 400, height = 400)
canvas.pack()
exit = Button(root, text='x', command = close)
exitWindow = canvas.create_window(10,10, window=exit)
minimize = Button(root, text='-', command = minimizeWindow)
minimizeWindow = canvas.create_window(30,10,window=minimize)
icon = PhotoImage(file='py.gif')
root.tk.call('wm', 'iconphoto', root._w, icon)
root.mainloop() # starts the mainloop
我正在尝试让它同时适用于 windows 和 linux。我完全去掉标题栏的原因是为了避免来自 OS 字体和 window 设置的差异。它目前在两个操作系统上都表现出同样的行为。
重申一下,我希望任务栏图标在程序启动时显示,我希望程序的 window 在从最小化恢复时保持其 titlebar-less 状态。
这取决于您使用的操作系统。如果您使用 Windows,以下解决方案应该适合您。
我添加了一个将重新应用 overriderdirect
的函数。我们在 root 上使用的绑定正在调用此函数。
我也已将您的 canvas 更改为框架,因为这样可以更轻松地管理按钮等内容。
对于 linux,您可能需要使用不同的文件类型。在 window 上您使用 .ico,而在 linux 上您可能需要使用 .xbm。
在 post 上看到这个答案:Python 3 tkinter iconbitmap error in ubuntu
更新:
我已经添加了 iconbitmap
和 root.tk.call('wm', 'iconphoto', root._w, icon)
,但是我不确定您是否能够更改任务栏图标,直到您至少在 windows 中编译代码。您可以使用 py2exe 或冻结。我以前用过 freeze,我有一个客户桌面和任务栏图标,我用它。
import tkinter as tk
root = tk.Tk()
root.geometry("400x400")
root.overrideredirect(1)
root.resizable(False, False)
root.columnconfigure(0, weight=1)
root.iconbitmap(default='./Colors/small_red.ico')
def close():
root.destroy()
def minimizeWindow():
root.withdraw()
root.overrideredirect(False)
root.iconify()
def check_map(event): # apply override on deiconify.
if str(event) == "<Map event>":
root.overrideredirect(1)
print ('Deiconified', event)
else:
print ('Iconified', event)
bar_frame = tk.Frame(root)
bar_frame.grid(row=0, column=0, sticky="ew")
bar_frame.columnconfigure(0, weight=1)
icon = tk.PhotoImage(file='./Colors/small_red.gif')
# This appears to have the same results so not sure what the difference is from iconbitmap.
# root.tk.call('wm', 'iconphoto', root._w, icon)
tk.Button(bar_frame, text='x', command=close).grid(row=0, column=1)
tk.Button(bar_frame, text='-', command=minimizeWindow).grid(row=0, column=2)
root.bind('<Map>', check_map) # added bindings to pass windows status to function
root.bind('<Unmap>', check_map)
root.mainloop()
有两种方法
如果您想在 new/custom Taskbar
中恢复它,只需这样做:-
from tkinter import *
import tkinter as tk
import datetime
import time
import math
root = tk.Tk()
def close():
root.destroy()
def minimizeWindow():
root.update_idletasks()
root.overrideredirect(False)
root.state('iconic')
root.attributes('-topmost', True)
root.overrideredirect(True)
root.geometry("215x330")
root.wm_overrideredirect(True)
root.attributes('-topmost', False)
root.resizable(False, False)
canvas = Canvas(root, width = 400, height = 400)
canvas.pack()
exit = Button(root, text='x', command = close)
exitWindow = canvas.create_window(10,10, window=exit)
minimize = Button(root, text='-', command = minimizeWindow)
minimizeWindow = canvas.create_window(30,10,window=minimize)
icon = PhotoImage(file='py.gif')
root.tk.call('wm', 'iconphoto', root._w, icon)
root.mainloop()
否则,如果您想在 windows Taskbar
中恢复:-
from tkinter import *
import tkinter as tk
import datetime
import time
import math
root = tk.Tk()
root.overrideredirect(1)
def check(event):
if str(event) == "<Map event>":
window.overrideredirect(1)
else:
None
def close():
root.destroy()
def minimizeWindow():
root.withdraw()
root.overrideredirect(False)
root.iconify()
root.overrideredirect(True)
root.resizable(False, False)
canvas = Canvas(root, width = 400, height = 400)
canvas.pack()
exit = Button(root, text='x', command = close)
exitWindow = canvas.create_window(10,10, window=exit)
minimize = Button(root, text='-', command = minimizeWindow)
minimizeWindow = canvas.create_window(30,10,window=minimize)
icon = PhotoImage(file='py.gif')
root.tk.call('wm', 'iconphoto', root._w, icon)
root.bind('<Map>', check_map)
root.bind('<Unmap>', check_map)
root.mainloop() # starts the mainloop
我有一个 tkinter
window,我从中删除了标题栏并添加了自定义关闭和最小化按钮。当程序首次加载时,它不会在任务栏上显示图标。当我单击自定义的最小化按钮时,它会在任务栏上创建一个图标;但是,当我单击恢复 window 时,我无法再次摆脱标题栏。
我希望图标始终显示在任务栏上,当程序最小化然后恢复时,我希望标题栏仍然从 .overrideredirect(1)
中消失。不幸的是,在不使任务栏图标消失的情况下,我无法在最小化前后重置标志。
请让我知道我做错了什么。谢谢!
#!/usr/bin/python3
from tkinter import *
import tkinter as tk
import datetime
import time
import math
root = tk.Tk()
root.overrideredirect(1)
def close():
root.destroy()
def minimizeWindow():
root.withdraw()
root.overrideredirect(False)
root.iconify()
root.resizable(False, False)
canvas = Canvas(root, width = 400, height = 400)
canvas.pack()
exit = Button(root, text='x', command = close)
exitWindow = canvas.create_window(10,10, window=exit)
minimize = Button(root, text='-', command = minimizeWindow)
minimizeWindow = canvas.create_window(30,10,window=minimize)
icon = PhotoImage(file='py.gif')
root.tk.call('wm', 'iconphoto', root._w, icon)
root.mainloop() # starts the mainloop
我正在尝试让它同时适用于 windows 和 linux。我完全去掉标题栏的原因是为了避免来自 OS 字体和 window 设置的差异。它目前在两个操作系统上都表现出同样的行为。
重申一下,我希望任务栏图标在程序启动时显示,我希望程序的 window 在从最小化恢复时保持其 titlebar-less 状态。
这取决于您使用的操作系统。如果您使用 Windows,以下解决方案应该适合您。
我添加了一个将重新应用 overriderdirect
的函数。我们在 root 上使用的绑定正在调用此函数。
我也已将您的 canvas 更改为框架,因为这样可以更轻松地管理按钮等内容。
对于 linux,您可能需要使用不同的文件类型。在 window 上您使用 .ico,而在 linux 上您可能需要使用 .xbm。
在 post 上看到这个答案:Python 3 tkinter iconbitmap error in ubuntu
更新:
我已经添加了 iconbitmap
和 root.tk.call('wm', 'iconphoto', root._w, icon)
,但是我不确定您是否能够更改任务栏图标,直到您至少在 windows 中编译代码。您可以使用 py2exe 或冻结。我以前用过 freeze,我有一个客户桌面和任务栏图标,我用它。
import tkinter as tk
root = tk.Tk()
root.geometry("400x400")
root.overrideredirect(1)
root.resizable(False, False)
root.columnconfigure(0, weight=1)
root.iconbitmap(default='./Colors/small_red.ico')
def close():
root.destroy()
def minimizeWindow():
root.withdraw()
root.overrideredirect(False)
root.iconify()
def check_map(event): # apply override on deiconify.
if str(event) == "<Map event>":
root.overrideredirect(1)
print ('Deiconified', event)
else:
print ('Iconified', event)
bar_frame = tk.Frame(root)
bar_frame.grid(row=0, column=0, sticky="ew")
bar_frame.columnconfigure(0, weight=1)
icon = tk.PhotoImage(file='./Colors/small_red.gif')
# This appears to have the same results so not sure what the difference is from iconbitmap.
# root.tk.call('wm', 'iconphoto', root._w, icon)
tk.Button(bar_frame, text='x', command=close).grid(row=0, column=1)
tk.Button(bar_frame, text='-', command=minimizeWindow).grid(row=0, column=2)
root.bind('<Map>', check_map) # added bindings to pass windows status to function
root.bind('<Unmap>', check_map)
root.mainloop()
有两种方法
如果您想在 new/custom Taskbar
中恢复它,只需这样做:-
from tkinter import *
import tkinter as tk
import datetime
import time
import math
root = tk.Tk()
def close():
root.destroy()
def minimizeWindow():
root.update_idletasks()
root.overrideredirect(False)
root.state('iconic')
root.attributes('-topmost', True)
root.overrideredirect(True)
root.geometry("215x330")
root.wm_overrideredirect(True)
root.attributes('-topmost', False)
root.resizable(False, False)
canvas = Canvas(root, width = 400, height = 400)
canvas.pack()
exit = Button(root, text='x', command = close)
exitWindow = canvas.create_window(10,10, window=exit)
minimize = Button(root, text='-', command = minimizeWindow)
minimizeWindow = canvas.create_window(30,10,window=minimize)
icon = PhotoImage(file='py.gif')
root.tk.call('wm', 'iconphoto', root._w, icon)
root.mainloop()
否则,如果您想在 windows Taskbar
中恢复:-
from tkinter import *
import tkinter as tk
import datetime
import time
import math
root = tk.Tk()
root.overrideredirect(1)
def check(event):
if str(event) == "<Map event>":
window.overrideredirect(1)
else:
None
def close():
root.destroy()
def minimizeWindow():
root.withdraw()
root.overrideredirect(False)
root.iconify()
root.overrideredirect(True)
root.resizable(False, False)
canvas = Canvas(root, width = 400, height = 400)
canvas.pack()
exit = Button(root, text='x', command = close)
exitWindow = canvas.create_window(10,10, window=exit)
minimize = Button(root, text='-', command = minimizeWindow)
minimizeWindow = canvas.create_window(30,10,window=minimize)
icon = PhotoImage(file='py.gif')
root.tk.call('wm', 'iconphoto', root._w, icon)
root.bind('<Map>', check_map)
root.bind('<Unmap>', check_map)
root.mainloop() # starts the mainloop