W importowanym kodzie, wartości zmiennej " " jest ustawione prawidłowo z datą wybraną przez użytkownika.

Wybór DEF jest wywoływany na wyjściu z kalendarza.

Utknąłem. Nie wiem, jak go złapać i używać go w moim głównym kodzie.

Wielkie dzięki.

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

-. -.-.-.-.-.-

TO DZIAŁA:

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)

TO NIE:

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
0
TonyIT 25 czerwiec 2017, 13:27

3 odpowiedzi

Najlepsza odpowiedź

Jak wspomniano w moich komentarzach, może być tylko jeden mainloop w kodzie. Pozostali zostaną po prostu ignorowane. Więc nie można używać go, aby czekać na odpowiedź z okna dziecka.

Solution, którego używałem

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

Kod otwiera okno i czeka wynik za pomocą Wait_Window () .

Dziękuje wszystkim. Cześć.

0
TonyIT 1 lipiec 2017, 17:07

Prosty program koncepcyjny dowód, który otrzymuje zmienną z klasy instancji w klasie.

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()
1
user4171906user4171906 26 czerwiec 2017, 21:16

Wszystko lokalne do funkcji ManagalendarWindow () jest zebrane śmieci, gdy funkcja wyjść. Obejmuje to aplikację (instancja klasy). Musisz go zwrócić, aby utrzymać go przy życiu. Należy również pamiętać, że nie ma siebie

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
user4171906user4171906 25 czerwiec 2017, 18:44