来自子窗口的数据

时间:2017-06-25 10:27:47

标签: python tkinter calendar

在导入的代码中,使用用户选择的日期正确设置变量“ 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()

-.-。-。-。-。-。-.-

这个工作:

def manageCalendarWindow():
    root4 = Tk()
    data = {}
    app = calendarWidget.Calendar(root4, data)
    root4.mainloop()
    return app    
app=manageCalendarWindow()
print(app.year_selected,app.month_selected,app.day_selected)

这不是:

class enterWindows():
    def B_CalendarWindow(self):`
        app=self.manageCalendarWindow()
        print("year: ",app.year_selected)
        print("and... this will never be printed!")

    def manageCalendarWindow(self):
        root4 = Tk()
        data = {}
        app = calendarWidget.Calendar(root4, data)
        root4.mainloop()
        return app

3 个答案:

答案 0 :(得分:1)

当函数退出时,函数manageCalendarWindow()的本地所有内容都被垃圾收集。这包括app(类实例)。你必须返回它以保持活着。另请注意,您发布的代码中没有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)

答案 1 :(得分:1)

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

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()

答案 2 :(得分:0)

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

我使用的解决方案是

    app = myCalendar.Calendar(personal_path, root4, gui_language)
    root4.wait_window(app.parent)
    return app

代码打开窗口并使用 wait_window()等待结果。

谢谢大家。 侨