Python 来自子窗口的数据

Python 来自子窗口的数据,python,tkinter,calendar,Python,Tkinter,Calendar,在导入的代码中,使用用户选择的日期正确设置变量“values” 在日历退出时调用def选择 我卡住了。我不知道如何捕捉它并在我的主代码中使用它 非常感谢 # MAIN CODE (simplified) from tkinter import * import calendarWidget def manageCalendarWindow(): root4 = Tk() data = {} app = calendarWidget.Calendar(root4,

在导入的代码中,使用用户选择的日期正确设置变量“values”

在日历退出时调用def选择

我卡住了。我不知道如何捕捉它并在我的主代码中使用它

非常感谢

# MAIN CODE (simplified)
from tkinter import *
import calendarWidget    
def manageCalendarWindow():
    root4 = Tk()
    data = {}
    app = calendarWidget.Calendar(root4, data)
    root4.mainloop()
manageCalendarWindow()
#how to get the date?
-.-.-.-.-.-.-

# CALENDAR WIDGET (simplified)
class Calendar:
    def setup(self, y, m)
        (...)
        for w, week in enumerate(self.cal.monthdayscalendar(y, m), 2):
            for d, day in enumerate(week):
                if day:
                    b = tk.Button(self.parent, width=1, text=day, relief = 'flat',\
                    command=lambda day=day:self.selection(day, calendar.day_name[(day-1) % 7]))
                    self.wid.append(b)
                    b.grid(row=w, column=d)

    def selection(self, day, name):
        self.day_selected = day
        self.month_selected = self.month
        self.year_selected = self.year
        self.day_name = name

        #data
        self.values['day_selected'] = day
        self.values['month_selected'] = self.month
        self.values['year_selected'] = self.year
        self.values['day_name'] = name
        self.values['month_name'] = calendar.month_name[self.month_selected]

        self.setup(self.year, self.month)
        print(self.values) # <--- here the value is correct
        self.parent.destroy()
这不是:
当函数退出时,函数manageCalendarWindow()本地的所有内容都会被垃圾收集。这包括应用程序(类实例)。你必须归还它才能让它活着。还要注意的是,您发布的代码中没有self.month,但我认为这是因为减少了此帖子的代码量

def manageCalendarWindow():
    root4 = Tk()
    data = {}
    app = calendarWidget.Calendar(root4, data)
    root4.mainloop()
    return app
    ## or
    ## return app.day_name
app=manageCalendarWindow()
print(app.day_name)
## or
##day_name=manageCalendarWindow()
##print(day_name)

当函数退出时,函数manageCalendarWindow()本地的所有内容都会被垃圾收集。这包括应用程序(类实例)。你必须归还它才能让它活着。还要注意的是,您发布的代码中没有self.month,但我认为这是因为减少了此帖子的代码量

def manageCalendarWindow():
    root4 = Tk()
    data = {}
    app = calendarWidget.Calendar(root4, data)
    root4.mainloop()
    return app
    ## or
    ## return app.day_name
app=manageCalendarWindow()
print(app.day_name)
## or
##day_name=manageCalendarWindow()
##print(day_name)

一个简单的概念证明程序,从类内实例化的类中获取变量

class SubClass():
    def __init__(self):
        self.variable="SubClass variable"

class MainClass():
    def __init__(self):
        app=self.instantiate_class()
        print(app.variable)  ## prints the string

    def instantiate_class(self):
        app=SubClass()
        print("app =", app)  ## not empty
        return app

MainClass()

一个简单的概念证明程序,从类内实例化的类中获取变量

class SubClass():
    def __init__(self):
        self.variable="SubClass variable"

class MainClass():
    def __init__(self):
        app=self.instantiate_class()
        print(app.variable)  ## prints the string

    def instantiate_class(self):
        app=SubClass()
        print("app =", app)  ## not empty
        return app

MainClass()

正如我在评论中提到的,代码中只能有一个mainloop。其他的将被忽略。因此,不可能使用它来等待子窗口的响应

我使用的解决方案是

    app = myCalendar.Calendar(personal_path, root4, gui_language)
    root4.wait_window(app.parent)
    return app
代码打开窗口并使用等待窗口()等待结果

谢谢大家。
再见。

正如我在评论中提到的,代码中只能有一个mainloop。其他的将被忽略。因此,不可能使用它来等待子窗口的响应

我使用的解决方案是

    app = myCalendar.Calendar(personal_path, root4, gui_language)
    root4.wait_window(app.parent)
    return app
代码打开窗口并使用等待窗口()等待结果

谢谢大家。
再见。

您关于“在日历退出时调用def选择方法”的评论听起来很关键。您能否包括调用“selection”的上下文?听起来这就是问题所在。我插入了调用选择的按钮的代码。谢谢,罗恩。:)您关于“在日历退出时调用def选择方法”的评论听起来很关键。您能否包括调用“selection”的上下文?听起来这就是问题所在。我插入了调用选择的按钮的代码。谢谢,罗恩。:)完美的你给我的建议是完美的。但如果我把它嵌套在另一个类中,它就会停止。我已经在其他人的后面添加了代码。打印(“而且……这永远不会被打印!”)在您退出Tkinter之前,不会打印任何内容。并检查您在self.year_selected中是否确实有一个值,即在课堂日历中创建/更新消息的时间/地点打印消息,以及它的值。我知道,Curly。我知道。。。但真的,我不知道如何得到这个约会。。。为什么,如果我在类中调用日历,变量app是空的。完美。你给我的建议是完美的。但如果我把它嵌套在另一个类中,它就会停止。我已经在其他人的后面添加了代码。打印(“而且……这永远不会被打印!”)在您退出Tkinter之前,不会打印任何内容。并检查您在self.year_selected中是否确实有一个值,即在课堂日历中创建/更新消息的时间/地点打印消息,以及它的值。我知道,Curly。我知道。。。但真的,我不知道如何得到这个约会。。。为什么,如果我在类中调用日历,变量app是空的。我想我已经发现了问题所在。从另一个窗口调用该窗口,从另一个窗口调用此窗口:主窗口>新记录窗口>日历窗口。因此,我了解到,在一个程序中,只有一个mainloop()可以工作,其他的将被忽略。只有一个链接到主窗口。没有其他人。程序不会等待结果并继续运行。它打开日历窗口,无法等待结果。或者,更好的是,我不知道如何暂停代码等待用户选择。我不知道该怎么办。非常感谢你的帮助。:)嗨,乔。我想我已经发现了问题所在。从另一个窗口调用该窗口,从另一个窗口调用此窗口:主窗口>新记录窗口>日历窗口。因此,我了解到,在一个程序中,只有一个mainloop()可以工作,其他的将被忽略。只有一个链接到主窗口。没有其他人。程序不会等待结果并继续运行。它打开日历窗口,无法等待结果。或者,更好的是,我不知道如何暂停代码等待用户选择。我不知道该怎么办。非常感谢你的帮助。:)说对
mainloop
的其他调用被忽略是错误的。它们绝对不会被忽略。说对
mainloop
的其他调用被忽略是错误的。他们绝对不会被忽视。