He creado una aplicación de calendario con vista de mes y semana en python. En la vista mensual, puedo escribir notas cada día, almacenarlas en un diccionario y guardar el diccionario en el disco para poder leerlo en cualquier momento.

Ahora estoy trabajando en la vista semanal. Logré mostrar la semana del mes con respecto al día que elegí de la vista mensual (el número de la semana y los días, de lunes a domingo). En el código, usé {{X0} } para el número de la semana y los días de la semana adjuntos en un Gtk.Grid. Debajo de cada día he adjuntado un Gtk.TextView usando un bucle for in creando una lista de Gtk.TextView donde se muestran las notas de cada día desde la vista mensual. En este momento he logrado mostrar solo una nota cada vez que elijo un día de la semana. Si tengo varias notas en diferentes días, no puedo mostrarlas todas. Y esta es mi pregunta. A continuación se muestra un fragmento de código donde se actualiza el calendario semanal (def update_week_cal). ¿Cómo modificar el código en la parte del bucle, para que pueda mostrar todas las notas en cada semana que he seleccionado de la vista mensual?

    def update_week_cal(self, *args):
        year, month, day = self.calendar.get_date()
        month = month + 1
        today = datetime.date(year, month, day)
        self.page2.remove(self.label)
        self.label = Gtk.Label(str(today.isocalendar()[1]) + "η Εβδομάδα")
        self.page2.attach(self.label, 3, 1, 1, 1)
        dates = list([today + datetime.timedelta(days=i) for i in range(0 - today.weekday(), 7 - today.weekday())])
        j = 0
        for days in dates:
            self.labels[j].destroy()
            if days == today:
                self.labels[j] = Gtk.Label()
                self.labels[j].set_markup('<span font = "12" weight = "bold">{0}</span>'.format(days.strftime("%a ""%d/""%m")))
            else:
                self.labels[j] = Gtk.Label(days.strftime("%a ""%d/""%m"))
            self.page2.attach(self.labels[j], j, 2, 1, 1)
            self.page2.remove(self.textviews[j])
            self.textviews[j] = Gtk.TextView()
            self.textviews[j].set_editable(False)
            self.textviews[j].set_wrap_mode(Gtk.WrapMode.WORD_CHAR)
            self.page2.attach(self.textviews[j], j, 3, 1, 1)
            for i in range(7):
                try:
                    if self.text is not None and self.d[(year, month, day)]:
                        x = int(today.strftime("%w"))-1
                        self.textviews[x].get_buffer().set_text(self.text)
                except KeyError:
                    x = int(today.strftime("%w")) - 1
                    self.textviews[x].get_buffer().set_text(self.text)
                    print(i, j, x)

                except TypeError:
                    x = int(today.strftime("%w")) - 1
                    self.textviews[x].get_buffer().set_text(self.text)

            self.show_all()
            j = j + 1

Tenga en cuenta que he usado el mismo Gtk.TextBuffer para la vista mensual y semanal. self.text son las notas de la vista mensual.

Gracias de antemano.

-2
cgiannakidis 5 oct. 2019 a las 20:16

1 respuesta

La mejor respuesta

Bueno, logré mostrar las notas según la fecha, cambiando la forma de pensar el problema y comenzando desde el principio. El nuevo código se agregó al final del anterior, restando esto:

            for i in range(7):
                try:
                    if self.text is not None and self.d[(year, month, day)]:
                        x = int(today.strftime("%w"))-1
                        self.textviews[x].get_buffer().set_text(self.text)
                except KeyError:
                    x = int(today.strftime("%w")) - 1
                    self.textviews[x].get_buffer().set_text(self.text)
                    print(i, j, x)

                except TypeError:
                    x = int(today.strftime("%w")) - 1
                    self.textviews[x].get_buffer().set_text(self.text)

La respuesta al problema es el siguiente código:

list_of_dates = list(self.d.keys())
list_of_notes = list(self.d.values())
dictionary = dict(zip(list_of_dates, list_of_notes))
for key in dictionary.items():
    date = datetime.date(year=key[0][0], month=key[0][1]+1, day=key[0][2])
    week_of_day = str(date.isocalendar()[1])            
    day_of_week = int(date.strftime("%w"))-1          
    if week == week_of_day:
        self.textviews[day_of_week].get_buffer().set_text(key[1])
0
cgiannakidis 7 oct. 2019 a las 22:23