没有标题栏的python tkinter还原窗口

时间:2018-10-09 05:40:51

标签: python tkinter icons taskbar titlebar

我有一个tkinter窗口,我从中删除了标题栏,并向其中添加了一个自定义关闭和最小化按钮。程序首次加载时,它不会在任务栏上显示图标。当我单击定制的最小化按钮时,它将在任务栏上创建一个图标。但是,当我单击以恢复窗口时,无法再次摆脱标题栏。

我希望图标始终显示在任务栏上,并且在最小化程序然后还原程序时,我希望标题栏仍然从.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字体和窗口设置带来的差异。当前在两个操作系统上都表现出相同的行为。

重申一下,我希望任务栏图标在程序启动时显示,并且希望程序窗口在从最小化还原时保持其无标题栏的状态。

2 个答案:

答案 0 :(得分:1)

这取决于您使用的操作系统。如果您使用的是Windows,则以下解决方案应该适用于您。

我添加了一个将重新应用overriderdirect的功能。此函数由我们在根目录上使用的绑定调用。

我也将您的画布更改为框架,因为这样可以更轻松地管理按钮之类的东西。

对于Linux,您可能需要使用其他文件类型。在Windows上,您使用.ico;在Linux上,您可能需要使用.xbm。

在此信息上查看有关此问题的答案:Python 3 tkinter iconbitmap error in ubuntu

更新:

我已经添加了iconbitmaproot.tk.call('wm', 'iconphoto', root._w, icon),但是不确定在至少在Windows中编译代码之前,是否能够更改任务栏图标。您可以使用py2exe或冻结。我以前使用过冻结功能,并且有用于它的客户桌面和任务栏图标。

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()

答案 1 :(得分:0)

有两种方法

如果您想在新的/自定义 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