如何在外部变量中保存值?

How do I save a value in an external variable?

疑惑如下,我想 select 使用 tkcalendar 库的日期,select 编辑正确,但我不能在函数外使用变量。

def dateentry_view():
    def print_sel():
        date = cal.get_date()
        print(date)
    top = tk.Toplevel(root)

    ttk.Label(top, text='Elige el día').pack()
    cal = DateEntry(top)
    cal.pack(padx=10, pady=10)
    ttk.Button(top, text="Aceptar", command=print_sel).pack()

如何传递 date 变量以在 Label 中显示它,如下所示:

labelDate = Label(root,textvariable=date)

我已经尝试将 Label 放入函数中,但它仍然没有显示 date 变量。

def dateentry_view():
    
    top = tk.Toplevel(root)

    ttk.Label(top, text='Elige el día').pack()
    cal = DateEntry(top)
    cal.pack(padx=10, pady=10)
    ttk.Button(top, text="Aceptar", command=print_sel).pack() 

    def print_sel():
         date = cal.get_date()
         print(date)
         labelFecha = Label(root,textvariable=date)

当我打印 date 时,它会显示我 select 编辑正确的日期。

从谷歌搜索 tk.Label 看来 textvariable 的想法是它指的是可变的 tk.StringVar,而不是正常的 Python str(这是不可变的)。因此,您需要做的就是在外部作用域中声明 StringVar,然后在回调中更新它:

    date = tk.StringVar()
    def set_date():
         date.set(cal.get_date())

    ttk.Button(top, text="Aceptar", command=set_date).pack() 
    labelFecha = Label(root, textvariable=date)

您没有正确使用 textvariable- 选项。您需要将其设置为对 tk.StringVar 变量 class 实例的引用。之后对变量值的任何更改都会自动更新小部件显示的内容。

另请注意,tkcalendar.DateEntry.get_date() 方法 returns 是一个 datetime.date,不是字符串,因此在设置 [=15= 之前,您需要手动将其转换为字符串]的价值。

这里有一个可运行的例子来说明我在说什么:

import tkinter as tk
import tkinter.ttk as ttk
from tkcalendar import DateEntry


def dateentry_view():
    def print_sel():
        date = cal.get_date()  # Get datetime.date.
        fechaStr = date.strftime('%Y-%m-%d')  # Convert datetime.date to string.
        fechaVar.set(fechaStr)  # Update StringVar with formatted date.
        top.destroy()  # Done.

    top = tk.Toplevel(root)

    ttk.Label(top, text='Elige el día').pack()
    cal = DateEntry(top)
    cal.pack(padx=10, pady=10)
    ttk.Button(top, text="Aceptar", command=print_sel).pack()


root = tk.Tk()

ttk.Button(root, text="Ejecutar prueba", command=dateentry_view).pack()
fechaVar = tk.StringVar(value='<no date>')  # Create and initialize control variable.
labelFecha = tk.Label(root, textvariable=fechaVar)  # Use it.
labelFecha.pack()

root.mainloop()