Python tkinter Button回调函数中已定义的变量,再使用该变量时提示未定义变量。

from tkinter import Tk, Frame, Button, Label, Entry, StringVar, IntVar , mainloop
import datetime 
root = Tk()

v1 = StringVar()
v2 = StringVar()
v3 = StringVar()
v4 = int()
v5 = int()
v6 = int()


frame1 = Frame(root)
frame2 = Frame(root)
frame3 = Frame(root)
frame1.pack(padx = 20, pady = 20)
frame2.pack(padx = 20, pady = 20)
frame3.pack(padx = 20, pady = 20)

Label(frame1, text = "开始时间:").grid(row = 0, column = 0)
Entry(frame1, width = 6, textvariable = v1, validate = "key").grid(row = 0, column = 1)
Label(frame1, text = "年").grid(row = 0, column = 2)
Entry(frame1, width = 6, textvariable = v2, validate = "key").grid(row = 0, column = 3)
Label(frame1, text = "月").grid(row = 0, column = 4)
Entry(frame1, width = 6, textvariable = v3, validate = "key").grid(row = 0, column = 5)
Label(frame1, text = "日").grid(row = 0, column = 6)


def callbackMin():
    v4 = int(v1.get())
    v5 = int(v2.get())
    v6 = int(v3.get())
    Startday = datetime.date(v4, v5, v6)

theButtonMin = Button(frame1, text = "获取时间", command = callbackMin).grid(row = 0, column = 7)
frame3.bind("<Button>", callbackMin)

print(Startday)

mainloop()

目的是触发按钮时在回调函数中为变量赋值,变量在后续代码中使用。
通过Button组件回调函数获取文本框中输入的年月日时间,将获取到的时间赋值给变量Startday,后续程序使用这两个变量进行计算。
但程序运行未打开tkinter窗口,没法通过Button触发获取文本框内容,也就没法为变量Startday赋值。但程序后续代码,需要这个变量参与计算,这时会提示变量未定义(Undefined name ‘Startday’)。
尝试过为Startday定义全局变量,或在callbackSetMin()中return出这个变量值,或初始化变量,都失败了。
救助大家有啥办法。

你在函数里边定义的Startday是局部变量,只有在函数里边可见,应该定义为全局变量才行,可采用如下的定义方式:

from tkinter import Tk, Frame, Button, Label, Entry, StringVar, IntVar , mainloop
import datetime 
root = Tk()

v1 = StringVar()
v2 = StringVar()
v3 = StringVar()
v4 = int()
v5 = int()
v6 = int()
Startday=None


frame1 = Frame(root)
frame2 = Frame(root)
frame3 = Frame(root)
frame1.pack(padx = 20, pady = 20)
frame2.pack(padx = 20, pady = 20)
frame3.pack(padx = 20, pady = 20)

Label(frame1, text = "开始时间:").grid(row = 0, column = 0)
Entry(frame1, width = 6, textvariable = v1, validate = "key").grid(row = 0, column = 1)
Label(frame1, text = "年").grid(row = 0, column = 2)
Entry(frame1, width = 6, textvariable = v2, validate = "key").grid(row = 0, column = 3)
Label(frame1, text = "月").grid(row = 0, column = 4)
Entry(frame1, width = 6, textvariable = v3, validate = "key").grid(row = 0, column = 5)
Label(frame1, text = "日").grid(row = 0, column = 6)


def callbackMin():
    global  Startday
    v4 = int(v1.get())
    v5 = int(v2.get())
    v6 = int(v3.get())
    Startday = datetime.date(v4, v5, v6)
    print(Startday)

theButtonMin = Button(frame1, text = "获取时间", command = callbackMin).grid(row = 0, column = 7)
frame3.bind("<Button>", callbackMin)



mainloop()

你需要在callbackMin()函数中返回Startday,并且在主函数中使用Startday接收回调函数

from tkinter import Tk, Frame, Button, Label, Entry, StringVar, IntVar, mainloop
import datetime

root = Tk()

v1 = StringVar()
v2 = StringVar()
v3 = StringVar()
v4 = int()
v5 = int()
v6 = int()

frame1 = Frame(root)
frame2 = Frame(root)
frame3 = Frame(root)
frame1.pack(padx=20, pady=20)
frame2.pack(padx=20, pady=20)
frame3.pack(padx=20, pady=20)

Label(frame1, text="开始时间:").grid(row=0, column=0)
Entry(frame1, width=6, textvariable=v1, validate="key").grid(row=0, column=1)
Label(frame1, text="年").grid(row=0, column=2)
Entry(frame1, width=6, textvariable=v2, validate="key").grid(row=0, column=3)
Label(frame1, text="月").grid(row=0, column=4)
Entry(frame1, width=6, textvariable=v3, validate="key").grid(row=0, column=5)
Label(frame1, text="日").grid(row=0, column=6)


def callbackMin():
    v4 = int(v1.get())
    v5 = int(v2.get())
    v6 = int(v3.get())
    Startday = datetime.date(v4, v5, v6)
    return Startday


theButtonMin = Button(frame1, text="获取时间", command=callbackMin).grid(row=0, column=7)
Startday = frame3.bind("<Button>", callbackMin)

print(Startday)

mainloop()

你用 global 试试?

函数中的变量叫做局部变量,不可在外面访问。
你可以使用global关键字在函数开头声明这是全局变量。
你可以先在函数外建一个变量:例如
abc=1
def func():
global abc #这里就是声明这里的abc是全局变量
abc=2#修改abc的值
如果没有加global语句,解释器就会以为那是函数里的局部变量,只能在函数中使用,出了函数就没有用了