never725 2020-06-10 16:02 采纳率: 0%
浏览 623
已结题

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出这个变量值,或初始化变量,都失败了。
救助大家有啥办法。

  • 写回答

4条回答 默认 最新

  • 吃鸡王者 2020-06-10 16:36
    关注

    你在函数里边定义的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()
    
    
    评论

报告相同问题?

悬赏问题

  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘