Окно восстановления Python Tkinter без строки заголовка - PullRequest
0 голосов
/ 09 октября 2018

У меня есть окно 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.Причина, по которой я вообще убираю строку заголовка, состоит в том, чтобы избежать различий, которые связаны с настройками шрифта и окна ОС.В настоящее время он демонстрирует одинаковое поведение в обеих операционных системах.

Повторюсь, я хочу, чтобы значок на панели задач отображался при запуске программы, и я хочу, чтобы окно программы поддерживало свое состояние без заголовков при восстановлении из минимизированного состояния.

1 Ответ

0 голосов
/ 09 октября 2018

Это зависит от того, какую операционную систему вы используете.Если вы используете Windows, приведенное ниже решение должно работать для вас.

Я добавил функцию, которая будет повторно применять overriderdirect.Эта функция вызывается привязкой, которую мы использовали для root.

Я также изменил ваш холст на фрейм, так как это облегчает управление такими вещами, как кнопки.

Для Linux вам может понадобитьсяиспользовать другой тип файла.В окне, которое вы используете .ico, а в Linux вам может понадобиться .xbm.

См. Ответ об этом в этом посте: Python 3 tkinter iconbitmap error в ubuntu

Обновление:

Я добавил iconbitmap и root.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()
...