【问题标题】:Threading Error: NameError: name 'datelabelstringvar' is not defined [closed]线程错误:NameError:名称'datelabelstringvar'未定义[关闭]
【发布时间】:2020-05-15 01:40:16
【问题描述】:

在 python 中,我希望一个函数与我的普通脚本同时运行。我搜索了互联网并找到了线程,但是,当我实现它并运行代码时,出现错误NameError: name 'datelabelstringvar' is not defined。我不知道出了什么问题,但是当我删除线程并将功能分配给一个按钮时(我不想只是清楚,我希望它是自动的),它工作正常。

代码:

from tkinter import *
from tkinter import messagebox
from tkinter import filedialog
from numerize import numerize
import pygame
import os
import random
from datetime import datetime
import threading
import time

wholedate = datetime.date(datetime.now())
date = wholedate.strftime("%d")
month = wholedate.strftime("%m")
year = wholedate.strftime("%Y")

def advancetime():
    global date
    global month
    global year
    threading.Timer(5.0, advancetime).start()
    if month == "09" or month == "04" or month == "06" or month == "11":
        date = int(date) + 1
        if date > 30:
            date = 1
            month = int(month) + 1
            if month > 12:
                month = 1
                year = int(year) + 1
        fixdate()
        fixmonth()
        datelabelstringvar.set(str(date) + "/" + str(month) + "/" + str(year))
        return
    if month == "01" or month == "03" or month == "05" or month == "07" or month == "08" or month == "10" or month == "12":
        date = int(date) + 1
        if date > 31:
            date = 1
            month = int(month) + 1
            if month > 12:
                month = 1
                year = int(year) + 1
        fixdate()
        fixmonth()
        datelabelstringvar.set(str(date) + "/" + str(month) + "/" + str(year))
        return
    if month == "02":
        date = int(date) + 1
        if date > 31:
            date = 1
            month = int(month) + 1
            if month > 12:
                month = 1
                year = int(year) + 1
        fixdate()
        fixmonth()
        datelabelstringvar.set(str(date) + "/" + str(month) + "/" + str(year))

def calendarOnClose():
    root.deiconify()
    calendarwindow.destroy()

def calendar():
    global datelabelstringvar
    global calendarwindow
    root.withdraw()
    calendarwindow = Toplevel()
    calendarwindow.title("Calendar")
    calendarwindow.geometry("400x350+300+100")
    calendarwindow.protocol("WM_DELETE_WINDOW", calendarOnClose)
    datelabelstringvar = StringVar()
    datelabelstringvar.set(str(date) + "/" + str(month) + "/" + str(year))
    datelabel = Label(calendarwindow, textvariable=datelabelstringvar).grid(row="0", column="0")
    Button(calendarwindow, text="Advance Time", command=advancetime).grid(row="1", column="0")
    totalfruitclickerstringvar = StringVar()
    totalfruitclickerstringvar.set("Fruit Clicked: " + str(totalfruitclicked))
    Label(calendarwindow, textvariable=totalfruitclickerstringvar).grid(row="2", column="0")

root = Tk()
root.title("Fruit Clicker")
root.geometry("400x350+300+100")

calendarbutton = Button(root, text="Calendar", fg="White", bg="Black", width="11", command=calendar)
calendarbutton.grid(row="8", column="0")

advancetime()

root.mainloop()

如何解决此错误?谢谢。

编辑: 完全错误:

Traceback (most recent call last):
  File "C:\Users\colli\Documents\GitHub\FruitClicker\windows\main.py", line 1708, in <module>
    advancetime()
  File "C:\Users\colli\Documents\GitHub\FruitClicker\windows\main.py", line 113, in advancetime
    datelabelstringvar.set(str(date) + "/" + str(month) + "/" + str(year))
NameError: name 'datelabelstringvar' is not defined

【问题讨论】:

  • edit您的问题包括minimal reproducible example
  • @Bryan Oakley 我刚刚编辑了它,可以吗?
  • 还有很多不必要的代码。例如,所有这些“if”语句真的有必要this question吗?
  • 你不应该在root.mainloop()之前调用advancetime(),因为此时calendar()还没有被调用,所以datelabelstringvar还没有被创建。
  • 我试过了,advancetime() 没有运行

标签: python python-3.x multithreading tkinter


【解决方案1】:

您的代码多次引用datelabelstringvar 变量。但是,您永远不会定义它。这就是 Python 所说的。

编辑:

您似乎从未调用过定义变量的calendar 函数。

【讨论】:

  • datelabelstringvar 在日历中定义
  • 那你需要导入它。
  • 怎么样?我已经全球化了,那不应该吗?当我删除线程时,它工作正常
  • 不。你需要告诉 Python 你想使用来自calendar 模块的datelabelstringvar 变量。所以,from calendar import datelabelstringvar.
  • 啊。我修好了它。我所要做的就是在calendar 中添加global datelabelstringvar。感谢您在advancetime 之前致电calendar 的指导
猜你喜欢
  • 2013-01-13
  • 2016-03-11
  • 2021-08-23
  • 2016-12-20
  • 2023-03-05
  • 2020-12-23
  • 2014-03-18
  • 2021-07-27
  • 1970-01-01
相关资源
最近更新 更多