J'essaie de centrer une fenêtre tkinter. Je sais que je peux programmer par programme la taille de la fenêtre et la taille de l'écran et l'utiliser pour définir la géométrie, mais je me demande s'il existe un moyen plus simple de centrer la fenêtre sur l'écran.
Vous pouvez essayer d'utiliser les méthodes winfo_screenwidth
et winfo_screenheight
, qui renvoient respectivement la largeur et la hauteur (en pixels) de votre instance Tk
(fenêtre), et avec quelques calculs de base, vous pouvez centrer votre fenêtre:
import tkinter as tk
from PyQt4 import QtGui # or PySide
def center(toplevel):
toplevel.update_idletasks()
# Tkinter way to find the screen resolution
# screen_width = toplevel.winfo_screenwidth()
# screen_height = toplevel.winfo_screenheight()
# PyQt way to find the screen resolution
app = QtGui.QApplication([])
screen_width = app.desktop().screenGeometry().width()
screen_height = app.desktop().screenGeometry().height()
size = Tuple(int(_) for _ in toplevel.geometry().split('+')[0].split('x'))
x = screen_width/2 - size[0]/2
y = screen_height/2 - size[1]/2
toplevel.geometry("+%d+%d" % (x, y))
toplevel.title("Centered!")
if __== '__main__':
root = tk.Tk()
root.title("Not centered")
win = tk.Toplevel(root)
center(win)
root.mainloop()
J'appelle la méthode update_idletasks
avant de récupérer la largeur et la hauteur de la fenêtre afin de m'assurer que les valeurs renvoyées sont exactes.
Tkinter ne voit pas s’il ya 2 ou plusieurs moniteurs étendus horizontalement ou verticalement. Ainsi, vous obtiendrez la résolution totale de tous les écrans ensemble et votre fenêtre se retrouvera quelque part au milieu des écrans.
PyQt d'autre part, ne voit pas l'environnement multi-moniteurs non plus, mais il obtiendra uniquement la résolution du moniteur supérieur gauche (Imagine 4 moniteurs, 2 en haut et 2 en bas formant un carré). Donc, il fait le travail en plaçant la fenêtre au centre de cet écran. Si vous ne voulez pas utiliser les deux, PyQt et Tkinter , il serait peut-être préférable d’utiliser PyQt dès le début.
Tk fournit une fonction d'assistance qui peut le faire en tant que tk::PlaceWindow
, mais je ne pense pas qu'elle ait été exposée en tant que méthode encapsulée dans Tkinter. Vous souhaitez centrer un widget en utilisant les éléments suivants:
from tkinter import *
app = Tk()
app.eval('tk::PlaceWindow %s center' % app.winfo_pathname(app.winfo_id()))
app.mainloop()
Cette fonction devrait également traiter correctement plusieurs écrans. Il dispose également d'options permettant de se centrer sur un autre widget ou par rapport au pointeur (utilisé pour placer des menus contextuels), afin d'éviter toute chute de l'écran.
J'ai trouvé une solution à la même question sur ce site
from tkinter import Tk
from tkinter.ttk import Label
root = Tk()
Label(root, text="Hello world").pack()
# Apparently a common hack to get the window size. Temporarily hide the
# window to avoid update_idletasks() drawing the window in the wrong
# position.
root.withdraw()
root.update_idletasks() # Update "requested size" from geometry manager
x = (root.winfo_screenwidth() - root.winfo_reqwidth()) / 2
y = (root.winfo_screenheight() - root.winfo_reqheight()) / 2
root.geometry("+%d+%d" % (x, y))
# This seems to draw the window frame immediately, so only call deiconify()
# after setting correct window position
root.deiconify()
root.mainloop()
bien sûr, je l'ai modifié en conséquence, cela fonctionne.
import tkinter as tk
win = tk.Tk() # Creating instance of Tk class
win.title("Centering windows")
win.resizable(False, False) # This code helps to disable windows from resizing
window_height = 500
window_width = 900
screen_width = win.winfo_screenwidth()
screen_height = win.winfo_screenheight()
x_cordinate = int((screen_width/2) - (window_width/2))
y_cordinate = int((screen_height/2) - (window_height/2))
win.geometry("{}x{}+{}+{}".format(window_width, window_height, x_cordinate, y_cordinate))
win.mainloop()
J'utilise frame et expand option. Très simple. Je veux des boutons au milieu de l'écran. Redimensionner la fenêtre et le bouton restent au milieu. Ceci est ma solution.
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)
Utilisation:
import tkinter as tk
if __== '__main__':
root = tk.Tk()
root.title('Centered!')
w = 800
h = 650
ws = root.winfo_screenwidth()
hs = root.winfo_screenheight()
x = (ws/2) - (w/2)
y = (hs/2) - (h/2)
root.geometry('%dx%d+%d+%d' % (w, h, x, y))
root.mainloop()