【问题标题】:Using my local variable outside of the function在函数之外使用我的局部变量
【发布时间】:2020-12-01 09:23:08
【问题描述】:

随着我对脚本的深入研究,我遇到了另一个问题。

我同时使用 tkinter 和 tkcalendar 并且有这样的东西:

我设置了一个函数,当您单击“validez la date”按钮时,它会存储从 tkcalendar 的cal.getdate() 函数获得的日期。问题是我无法在函数之外使用该变量。

这是我的功能:

def setdate():
    datechoisie = cal.get_date()
    datechoisie = datechoisie.replace("/", "-")
    datechoisie = datechoisie.split('-')
    datechoisie = "-".join(reversed(datechoisie))
    mylabel.config(text="Date validée !")
    print(datechoisie)
    return(datechoisie)

复杂性在于,datechoisie 变量只有在按下相应按钮时才会获取值。

我怎样才能使这项工作或有更好的方法?

编辑:我尝试将datechoisie 设置为全局变量,如提及:

def setdate():
    global datechoisie1
    datechoisie = cal.get_date()
    datechoisie = datechoisie.replace("/", "-")
    datechoisie = datechoisie.split('-')
    datechoisie = "-".join(reversed(datechoisie))
    mylabel.config(text="Date validée !")
    datechoisie1 = datechoisie

print(datechoisie1)

我仍然得到datechoisie1 未定义?

【问题讨论】:

  • 遗憾的是,声明它是一个全局变量并没有帮助使用 return()。
  • 这就是同一个问题的答案。请在您尝试使用全局变量方法但不起作用的地方发布一些代码。

标签: python function tkinter


【解决方案1】:

您在任何时候都没有调用setdate(),因此没有分配datechoisie1。在你的函数之后调用setdate()

但是,通常在函数内部分配公共变量是一种非常糟糕的做法。如果你真的想使用一个公共变量,你应该在函数之外定义它:

datechoisie1 = None

def setdate():
    datechoisie1 = cal.get_date()
    datechoisie1 = datechoisie.replace("/", "-")
    datechoisie1 = datechoisie.split('-')
    datechoisie1 = "-".join(reversed(datechoisie))
    mylabel.config(text="Date validée !")

setdate()
print(datechoisie1)

【讨论】:

  • 这就是问题所在,就像我说的那样,我的函数 setdate() 仅在按下“Validez la date”按钮时才被调用。如果我把你的 datechoisie = None 然后运行我的脚本,按下按钮运行该函数,然后打印 datechoisie,它仍然是“None”
  • @MaximeMichon 立即尝试。您在 setdate 中有 datechoisie 而不是 datechoisie1
【解决方案2】:

您可能应该有某种控制器来管理您的日历,而这种任务将由它来执行。此外,唯一实例的存储可以作为单例类存储在类本身中:

class MyCalendarController:
    calendar = None
    curDate = None
    instance = None

    def __init__(self, calendar):
        if MyCalendarController.instance == None: 
            MyCalendarController.instance = self
        self.calendar = calendar

    def updateDate(self):
        if (self.calendar):
            self.curDate = self.calendar.get_date()

    @classmethod
    def sharedInstance(cls, calendar = None):
        if cls.instance == None: return cls(calendar)
        else: return cls.instance


# usage :
theCalendar = cal # this is your calendar 
MyCalendarController.sharedInstance(theCalendar).updateDate()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    • 2011-04-15
    • 1970-01-01
    • 2018-05-27
    相关资源
    最近更新 更多