Programm zieht viel RAM und wird langsam

Fragen zu Tkinter.
Antworten
rundll
User
Beiträge: 9
Registriert: Freitag 13. Juni 2014, 12:48

Hallo,

Danke für die schnelle Antwort.
Jetzt ist es mir klar!

Ich melde mich wieder, wenn es etwas Neues gibt!

Gruß
BlackJack

Mal das ganze in einem Modul, mit zwei Klassen, in „pythonisch” statt „javaesque”, und ohne dauernd die halbe GUI neu zu erstellen und auszutauschen:

Code: Alles auswählen

from __future__ import print_function
try:
    import Tkinter as tk
except ImportError:
    import tkinter as tk
from calendar import Calendar, day_abbr, month_name
from datetime import date as Date
from functools import partial
try:
    from future_builtins import zip
except ImportError:
    pass
from itertools import chain, repeat
from locale import LC_ALL, setlocale
try:
    range = xrange
except NameError:
    pass


class Day(tk.Canvas, object):
    def __init__(
        self,
        master,
        day=0,
        active_color='white',
        disabled_color='grey',
        size='2c'
    ):
        self.active_color = active_color
        self.disabled_color = disabled_color
        tk.Canvas.__init__(
            self,
            master,
            width=size,
            height=size,
            bg=self.disabled_color,
            highlightbackground=self.disabled_color
        )
        self.create_text((1, 1), anchor='nw', tags='day_number')
        self._day = None
        self.day = day

    @property
    def day(self):
        return self._day

    @day.setter
    def day(self, day):
        self._day = day
        self.itemconfig('day_number', text=day if day else '')
        self['bg'] = self.active_color if day else self.disabled_color


class CalendarFrame(tk.Frame):

    def __init__(
        self, master, day_clicked_callback=lambda date: None, background='white'
    ):
        tk.Frame.__init__(self, master)
        self.day_clicked_callback = day_clicked_callback
        today = Date.today()
        self.year = today.year
        self.month = today.month
        self.calendar = Calendar()

        self.header_label = tk.Label(self, font=20)
        self.header_label.grid(row=0, column=1, columnspan=5)
        
        tk.Button(
            self, text='<-', command=self.goto_previous_month
        ).grid(row=0, column=0, sticky='news')
        tk.Button(
            self, text='->', command=self.goto_next_month
        ).grid(row=0, column=6, sticky='news')

        for day in self.calendar.iterweekdays():
            label = tk.Label(self, text=day_abbr[day], bg=background)
            label.grid(row=1, column=day, sticky='we', padx=1)

        self.cells = list()
        for row_number in range(6):
            row = list()
            for column_number in range(7):
                cell = Day(self, active_color=background)
                cell.grid(row=row_number + 2, column=column_number)
                cell.bind('<Button-1>', self._day_clicked)
                row.append(cell)
            self.cells.append(row)

        self.update()

    def _day_clicked(self, event):
        day = event.widget.day
        if day:
            self.day_clicked_callback(Date(self.year, self.month, day))

    def update(self):
        self.header_label['text'] = '{0} - {1}'.format(
            month_name[self.month], self.year
        )
        weeks = self.calendar.monthdayscalendar(self.year, self.month)
        for cells, week in zip(self.cells, chain(weeks, repeat([0] * 7))):
            for cell, day in zip(cells, week):
                cell.day = day

    def goto_previous_month(self):
        if self.month == 1:
            self.month = 12
            self.year -= 1
        else:
            self.month -= 1
        self.update()

    def goto_next_month(self):
        if self.month == 12:
            self.month = 1
            self.year += 1
        else:
            self.month += 1
        self.update()


def main():
    setlocale(LC_ALL, '')
    root = tk.Tk()
    calendar = CalendarFrame(root, partial(print, 'Tag:'))
    calendar.pack()
    root.mainloop()


if __name__ == '__main__':
    main()
rundll
User
Beiträge: 9
Registriert: Freitag 13. Juni 2014, 12:48

Hallo,

wow, jetzt funktioniert das perfekt!
Danke für das Beispiel, jetzt muss ich das genau analysieren :wink:
Wie hast du das so gut gelernt? Wielange hat das gedauert, bis du so gut mit Python umgehen konntest?
Hast du vor Python schon programmiert?
Bist du proffesioneller Programmierer?
(Ich mache das nur zum Hobby, bin Elektrotechniker)

Gruß
rundll
BlackJack

@rundll: Ich programmiere schon recht lange mit Python (>10 Jahre), habe auch schon recht lange davor in verschiedenen anderen Sprachen programmiert, und auch sonst gerne mal die ein oder andere Sprache ausprobiert. Programmieren gehört auch zum Job, hauptsächliche intern benutzte Webanwendungen, aber auch Kleinkram auf Kundenservern und -desktoprechnern. Versuche Python zu nehmen wo es geht, manchmal ist es leider auch Perl, PHP, Shell-Scripting, oder VBA (oder noch schlimmeres :-)).
rundll
User
Beiträge: 9
Registriert: Freitag 13. Juni 2014, 12:48

Hallo,

Oh, ok, das ist natürlich viel Erfahrung!
Sowiel habe ich leider noch nicht: Habe an der Uni Java gelernt und davor auch schon C programmiert, aber noch nicht viel mit Python gemacht.
Das wird sich aber jetzt ändern :mrgreen:
Auch dank deinem Beispiel und deiner Hilfe!

Gruß!
Antworten