如何在 Tkinter 上将 Canvas 小部件居中

How to center a Canvas Widget on Tkinter

我正在为一个项目学习 tkinter,但我不知道为什么我的布局不是我想要的样子。终端没有显示任何错误,所以我认为我没有遗漏任何参数或类似的东西。 This is how it currently looks and I intend for it to be like this.

谢谢!

import tkinter as tk
import tkinter.ttk

root = tk.Tk()
root.geometry('1920x1080')
root.configure(bg='blue')
seleccion = tk.IntVar()
seleccion.set(1)

canvas_input = tk.Canvas(root, width='1280', height='720')
canvas_input.configure(bg='white')
canvas_input.place(anchor='center')

tk.Label(root, text="Análisis meterológico").grid(row=0, column=1)
tk.Label(root, text="Bienvenido a nuestro proyecto!").grid(row=1, column=1)

entry1 = tk.Entry(root)

def obtenerCiudad():
    ciudad = entry1.get()
    label1 = tk.Label(root, text= ciudad)
    canvas_input.create_window(400, 200, window=label1.grid(row=4, column=2))

def ShowChoice():
    opcion = seleccion.get()
    label2 = tk.Label(root, text= opcion)
    canvas_input.create_window(400, 200, window=label2.grid(row=19, column=0))

opciones = [("Coordenadas de la ubicación", 1),
        ("Velocidad del viento", 2),
        ("Humedad actual", 3),
        ("Temperatura actual", 4),
        ("Estado del clima", 5),
        ("Lluvia actual", 6),
        ("Nubosidad actual", 7),
        ("Luz ultra violeta", 8),
        ("Calidad del aire", 9),
        ("Estadisticas completas", 10),
        ("Salir del programa", 11)]

canvas_input.create_window(400, 200, window=tk.Label(root, text="Qué desea consultar?").grid(row=2, column=0))
rows = 3

for opcion, val in opciones:
    rows += 1
    boton = tk.Radiobutton(root, text=opcion, variable=seleccion, command=ShowChoice, value=val).grid(row=rows, column=0)
    canvas_input.create_window(400, 200, window=boton)
    
canvas_input.create_window(400, 200, window=tkinter.ttk.Separator(root, orient='vertical').grid(column=1, row=2, rowspan='19', sticky='ns'))
canvas_input.create_window(400, 200, window=tk.Label(root, text="Ingrese la ciudad a la que desea consultar: ").grid(row=2, column=2))
canvas_input.create_window(400, 200, window=entry1.grid(row=2, column=3))
canvas_input.create_window(400, 200, window=tk.Button(text='Consultar', command=obtenerCiudad).grid(row=20, column=1))

root.mainloop()

如果您想使用中心选项,您需要使用 relxrely,然后调用 tk.CENTER 以获得 anchor。然后你必须改变你的小部件进入你的 canvas_input 而不是 root.

import tkinter as tk
import tkinter.ttk

root = tk.Tk()
root.geometry('1920x1080')
root.configure(bg='blue')
seleccion = tk.IntVar()
seleccion.set(1)

canvas_input = tk.Canvas(root, width='1280', height='720')
canvas_input.configure(bg='white')
canvas_input.place(relx=.5, rely=.5, anchor=tk.CENTER)

tk.Label(canvas_input, text="Análisis meterológico").grid(row=0, column=1)
tk.Label(canvas_input, text="Bienvenido a nuestro proyecto!").grid(row=1, column=1)

entry1 = tk.Entry(canvas_input)

def obtenerCiudad():
    ciudad = entry1.get()
    label1 = tk.Label(canvas_input, text= ciudad)
    canvas_input.create_window(400, 200, window=label1.grid(row=4, column=2))

def ShowChoice():
    opcion = seleccion.get()
    label2 = tk.Label(canvas_input, text= opcion)
    canvas_input.create_window(400, 200, window=label2.grid(row=19, column=0))

opciones = [("Coordenadas de la ubicación", 1),
        ("Velocidad del viento", 2),
        ("Humedad actual", 3),
        ("Temperatura actual", 4),
        ("Estado del clima", 5),
        ("Lluvia actual", 6),
        ("Nubosidad actual", 7),
        ("Luz ultra violeta", 8),
        ("Calidad del aire", 9),
        ("Estadisticas completas", 10),
        ("Salir del programa", 11)]

canvas_input.create_window(400, 200, window=tk.Label(canvas_input, text="Qué desea consultar?").grid(row=2, column=0))
rows = 3

for opcion, val in opciones:
    rows += 1
    boton = tk.Radiobutton(canvas_input, text=opcion, variable=seleccion, command=ShowChoice, value=val).grid(row=rows, column=0)
    canvas_input.create_window(400, 200, window=boton)
    
canvas_input.create_window(400, 200, window=tkinter.ttk.Separator(canvas_input, orient='vertical').grid(column=1, row=2, rowspan='19', sticky='ns'))
canvas_input.create_window(400, 200, window=tk.Label(canvas_input, text="Ingrese la ciudad a la que desea consultar: ").grid(row=2, column=2))
canvas_input.create_window(400, 200, window=entry1.grid(row=2, column=3))
canvas_input.create_window(400, 200, window=tk.Button(canvas_input, text='Consultar', command=obtenerCiudad).grid(row=20, column=1))

root.mainloop()