Как центрировать окно на экране в Tkinter?

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

4 Solutions collect form web for “Как центрировать окно на экране в Tkinter?”

Вы можете попробовать использовать методы winfo_screenwidth и winfo_screenheight , которые возвращают соответственно ширину и высоту (в пикселях) вашего экземпляра Tk (окно), а с помощью некоторой базовой математики вы можете центрировать свое окно:

 import tkinter as tk def center(toplevel): toplevel.update_idletasks() w = toplevel.winfo_screenwidth() h = toplevel.winfo_screenheight() size = tuple(int(_) for _ in toplevel.geometry().split('+')[0].split('x')) x = w/2 - size[0]/2 y = h/2 - size[1]/2 toplevel.geometry("%dx%d+%d+%d" % (size + (x, y))) if __name__ == '__main__': root = tk.Tk() root.title("Not centered") win = tk.Toplevel(root) win.title("Centered!") center(win) root.mainloop() По import tkinter as tk def center(toplevel): toplevel.update_idletasks() w = toplevel.winfo_screenwidth() h = toplevel.winfo_screenheight() size = tuple(int(_) for _ in toplevel.geometry().split('+')[0].split('x')) x = w/2 - size[0]/2 y = h/2 - size[1]/2 toplevel.geometry("%dx%d+%d+%d" % (size + (x, y))) if __name__ == '__main__': root = tk.Tk() root.title("Not centered") win = tk.Toplevel(root) win.title("Centered!") center(win) root.mainloop() 

Я update_idletasks метод update_idletasks перед тем, как получить ширину и высоту окна, чтобы гарантировать update_idletasks возвращаемых значений.

Общий подход к центрированию окна – вычисление соответствующих координат экрана для верхнего левого пикселя окна:

 x = (screen_width / 2) - (window_width / 2) y = (screen_height / 2) - (window_height / 2) 

Однако этого недостаточно для точного центрирования окна tkinter (по крайней мере, на Windows 7);
потому что ширина и высота окна, возвращаемые каким-либо способом, не будут включать самый внешний кадр, с названиями и кнопками min / max / close. Он также не будет включать панель меню (с файлом, редактированием и т. Д.). К счастью, есть способ найти их размеры.

Вот основная функция, которая не учитывает вышеупомянутую проблему:

 def center(win): win.update_idletasks() width = win.winfo_width() height = win.winfo_height() x = (win.winfo_screenwidth() // 2) - (width // 2) y = (win.winfo_screenheight() // 2) - (height // 2) win.geometry('{}x{}+{}+{}'.format(width, height, x, y)) 

Альтернативы: winfo_reqwidth() , winfo_reqheight()

Во-первых, и прежде всего, мы хотим вызвать метод update_idletasks() окна
непосредственно перед извлечением любой геометрии, чтобы гарантировать, что возвращаемые значения точны.

Важно понимать строки геометрии, используемые с методом geometry() .
Первая половина – ширина и высота окна, исключая внешний кадр,
а вторая половина – это верхние левые координаты x и y.

Существует четыре метода, которые позволят нам определить размеры внешнего фрейма.
winfo_rootx() даст нам верхнюю левую координату окна, исключая внешний кадр.
winfo_x() даст нам верхнюю левую координату x.
Их различие заключается в ширине внешнего кадра.

 frm_width = win.winfo_rootx() - win.winfo_x() win_width = win.winfo_width() + (2*frm_width) 

Разница между winfo_rooty() и winfo_y() будет нашей высотой заголовка / строки меню.

 titlebar_height = win.winfo_rooty() - win.winfo_y() win_height = win.winfo_height() + (titlebar_height + frm_width) 

Вот полная функция в рабочем примере:

 import tkinter # Python 3 def center(win): """ centers a tkinter window :param win: the root or Toplevel window to center """ win.update_idletasks() width = win.winfo_width() frm_width = win.winfo_rootx() - win.winfo_x() win_width = width + 2 * frm_width height = win.winfo_height() titlebar_height = win.winfo_rooty() - win.winfo_y() win_height = height + titlebar_height + frm_width x = win.winfo_screenwidth() // 2 - win_width // 2 y = win.winfo_screenheight() // 2 - win_height // 2 win.geometry('{}x{}+{}+{}'.format(width, height, x, y)) win.deiconify() if __name__ == '__main__': root = tkinter.Tk() root.attributes('-alpha', 0.0) menubar = tkinter.Menu(root) filemenu = tkinter.Menu(menubar, tearoff=0) filemenu.add_command(label="Exit", command=root.destroy) menubar.add_cascade(label="File", menu=filemenu) root.config(menu=menubar) frm = tkinter.Frame(root, bd=4, relief='raised') frm.pack(fill='x') lab = tkinter.Label(frm, text='Hello World!', bd=4, relief='sunken') lab.pack(ipadx=4, padx=4, ipady=4, pady=4, fill='both') center(root) root.attributes('-alpha', 1.0) root.mainloop() 

Один из способов предотвратить просмотр окна по экрану – использовать .attributes('-alpha', 0.0) чтобы сделать окно полностью прозрачным, а затем установить его в 1.0 после того, как окно было центрировано. Использование iconify() withdraw() или iconify() позже, за которым следует deiconify() , похоже, не работает, для этой цели, в Windows 7. Обратите внимание, что я использую deiconify() в качестве трюка для активации окна.

Tk предоставляет вспомогательную функцию, которая может сделать это как tk::PlaceWindow , но я не думаю, что она была выставлена ​​как завернутый метод в Tkinter. Вы бы центрировали виджет, используя следующее:

 from tkinter import * app = Tk() app.eval('tk::PlaceWindow %s center' % app.winfo_pathname(app.winfo_id())) app.mainloop() 

Эта функция также должна иметь дело с несколькими дисплеями. Он также имеет опции для центровки над другим виджетами или относительно указателя (используется для размещения всплывающих меню), чтобы они не падали с экрана.

Я использую функцию frame и expand. Очень просто. Я хочу несколько кнопок в середине экрана. Окно изменения размера и кнопки остаются посередине. Это мое решение.

 frame = Frame(parent_window) Button(frame, text='button1', command=command_1).pack(fill=X) Button(frame, text='button2', command=command_2).pack(fill=X) Button(frame, text='button3', command=command_3).pack(fill=X) frame.pack(anchor=CENTER, expand=1) 
  • Как скрыть или отключить указатель мыши в Tkinter?
  • Tkinter сообщение без окна?
  • Разница между параметрами «fill» и «expand» для метода tkinter pack
  • Код ввода клавиши со стрелкой не работает в tkinter
  • ttk.Combobox сбой, когда состояние доступно только для чтения и не в фокусе
  • Python3.5 backend_tkagg больше не доступен?
  • Отсутствует изображение Python
  • Tkinter help viewer
  • Python - лучший язык программирования в мире.