Как отключить строку заголовка в tkinter на Mac?

#python #user-interface #tkinter #titlebar #custom-titlebar

#python #пользовательский интерфейс #tkinter #строка заголовка #пользовательская строка заголовка

Вопрос:

Я пытаюсь удалить строку заголовка окна tkinter. Я хочу создать пользовательскую строку заголовка. Я искал этот ответ, и я нашел это.

 import tkinter as tk
root = tk.Tk()
# eliminate the titlebar
root.overrideredirect(1)
# your code here ...
root.mainloop()
  

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

 root.overrideredirect(1)
  

с помощью

 root.overrideredirect(0)
  

затем отобразится окно в обычном стиле Mac с тремя кнопками в углу.

Редактировать: я тоже пробовал это

 import tkinter as tk
root = tk.Tk()
# eliminate the titlebar

root.wm_attributes('-type', 'splash')

# your code here ...
root.mainloop()
  

Это сообщение об ошибке, которое я получаю

 Traceback (most recent call last):
  File "no-bar.py", line 5, in <module>
    root.wm_attributes('-type', 'splash')
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/tkinter/__init__.py", line 1967, in wm_attributes
    return self.tk.call(args)
_tkinter.TclError: bad attribute "-type": must be -alpha, -fullscreen, -modified, -notify, -titlepath, -topmost, or -transparent
  

Что я могу сделать, чтобы создать окно tkinter без строки заголовка?

Python 3.8.1 macOS 10.15.6

Ответ №1:

РЕДАКТИРОВАТЬ: Это относится только к версиям tk / tcl < 6.8.10 на macOS

После небольшого поиска я нашел ответ для пользователей Mac.

Если вы используете только

 root.overrideredirect(1)
  

Тогда окно будет скрыто на Mac. Итак, вам нужно добавить еще одну строку кода, чтобы она выглядела следующим образом

 root.overrideredirect(1)
root.overrideredirect(0)
  

При этом отобразится пустое окно.

пустое окно tkinter на Mac

Ответ №2:

Попробуйте это:

 root.wm_attributes('-type', 'splash')
  

вместо

 root.overrideredirect(1)
  

Я не уверен, работает ли это. Кроме того, я не могу протестировать это, поскольку я не пользователь Mac.

Комментарии:

1. Я добавил правку, чтобы показать сообщение об ошибке, которое я получаю. У меня есть ощущение, что это проблема Mac, но не совсем уверен.

2. Я понял ответ. root.overrideredirect(True) скрывает окно на Mac. Таким образом, вам нужно добавить root.overrideredirect(False) после него, и он покажет пустое окно.

3. Но в ОС Windows и Linux требуется только первая строка, чтобы скрыть строку заголовка. Кстати, спасибо за информирование.

Ответ №3:

Я думаю, что это также работает на tk / tcl 8.6.8, но вам нужно написать так:

             root = tk.Tk()
            root.overrideredirect(True)
            root.overrideredirect(False)
  

Если вы добавите что-либо между строками 1 и line2, 3, как показано ниже, это не будет работать корректно.

 DONT DO THIS!
            root = tk.Tk()

            root.configure(background='#292929')
            root.attributes('-alpha', 0.9)
            root.title('Monitor v{0}'.format(VER))
            size = '%dx%d %d %d' % (340, 200, 0, 0)
            root.geometry(size)
            root.resizable(width=False, height=False)
            root.protocol('WM_DELETE_WINDOW', lambda: sys.exit(0))

            root.overrideredirect(True)
            root.overrideredirect(False)