Problem mit klassen und objekten ^^

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Beitragvon cofi » Dienstag 16. Dezember 2008, 22:22

Ich dachte jetzt eher an den Code nicht an den Namen ;)
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Beitragvon numerix » Dienstag 16. Dezember 2008, 22:46

Es sieht doch immer deutlicher danach aus, als fehlten dir momentan noch die Voraussetzungen, um das Problem überhaupt vernünftig lösen zu können. Was ich allerdings nicht verstehe: Du hast in einem Post geschrieben, dass du irgendetwas im Unterricht so gezeigt bekommen hast. Wenn ihr in diesem Unterricht Tkinter behandelt habt, dann verstehe ich nicht, dass du mit mainloop() nicht klarkommst.

Für eine anständige Lösung deiner Anzeigetafel würde man IMHO ganz anders herangehen. Nicht für jede Ziffer eine eigene Funktion schreiben, nicht mit rectangle arbeiten, nicht mit absoluten Koordinaten usw.

Ein ordentlicher Ansatz könnte der sein, dass man sich zunächst einmal die übliche Bezeichnung einer Siebensegmentanzeige ansieht und dann eine brauchbare Datenstruktur entwirft. Das könnte dann z.B. so aussehen:

Code: Alles auswählen

import Tkinter as tk

class Segment7(tk.Canvas):

    def __init__(self, master, breite=200,
                 hintergrund="black", ziffernfarbe="white"):
        tk.Canvas.__init__(self, master)
        d = self.dicke = breite // 8
        l = breite - 3*d
        self.hintergrund, self.ziffernfarbe = hintergrund, ziffernfarbe
        self.config(width=breite, height=2*l+5*d, bg=hintergrund)
        self.segmente = {"a":(2*d,d,d+l,d),
                         "b":(d+d+l,d+d,d+d+l,d+d+l),
                         "c":(d+d+l,3*d+l,d+d+l,3*d+l+l),
                         "d":(2*d,4*d+l+l,d+l,4*d+l+l),
                         "e":(d,3*d+l,d,3*d+l+l),
                         "f":(d,d+d,d,d+d+l),
                         "g":(2*d,2.5*d+l,d+l,2.5*d+l)}
        self.ziffern = ["abcdef","bc","abged","abgcd","fgbc","afgcd","afedcg",
                       "abc","abcdefg","abcdfg"]

    def loesche(self):
        for segment in self.ziffern[8]:
            self.create_line(self.segmente[segment],
                        fill=self.hintergrund, width=self.dicke)

    def zeige(self,char):
        try:
            ziffer = int(char)
        except ValueError:
            return
        self.loesche()
        for segment in self.ziffern[ziffer]:
            self.create_line(self.segmente[segment],
                        fill=self.ziffernfarbe, width=self.dicke)

if __name__ == "__main__":
    root = tk.Tk()
    anzeige = Segment7(root, breite=300)
    anzeige.pack()
    anzeige.bind_all("<KeyPress>",lambda e:anzeige.zeige(e.char))
    root.mainloop()


Bedienung: Beim Drücken einer Zifferntaste erfolgt die entsprechende Anzeige.

Das ein oder andere könnte man auch anders lösen, z.B. auf die loesche()-Methode verzichten und die benötigte Funktionalität mit in zeige() implementieren. Dann ggf. auch statt alle Segmente immer zu löschen, bei der Anzeige einer Ziffer alle Segmente durchlaufen und im Fall, dass das entsprechende Segment zur Ziffer gehört, in Ziffernfarbe darstellen und ansonsten in Hintergrundfarbe. Das verbesserte etwas die Performance.

Man könnte auch noch eine weitere Farbe mit einbeziehen, so dass die nicht angezeigten Segmente nicht ganz verschwinden, sondern blass erkennbar sind usw. usw.
Dorfl
User
Beiträge: 17
Registriert: Sonntag 23. November 2008, 17:18

Beitragvon Dorfl » Mittwoch 17. Dezember 2008, 13:33

so... erstmal grooooßes Danke , sowohl für die erklärung als auch dafür das du dir die arbeit gemacht hast und nen beispielprogramm geschrieben hast.
verstehe jetzt auch wo das mainloop hingehört^^
und das mit dem unterricht... wir hatten nur nen beispiel code bekommen und sollten uns so alles zusammen reimen und bei fragen halt durften wir fragen...
daher wusste ich nicht genau zu 100% was , wo wie mainloop zu satzen ist :roll:
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Beitragvon numerix » Mittwoch 17. Dezember 2008, 14:50

Dorfl hat geschrieben:so... erstmal grooooßes Danke , sowohl für die erklärung als auch dafür das du dir die arbeit gemacht hast und nen beispielprogramm geschrieben hast.


Sinnvoller als den Code jetzt für dein Programm einfach zu übernehmen (falls du das tust) ist es in jedem Fall, wenn du versuchst, den Code zu verstehen, und damit meine ich wirklich *VERSTEHEN*, d.h. z.B. jemand anderem Zeile für Zeile zu erklären, was da passiert und warum die Zeile so ist wie sie ist. Das ist mit Arbeit verbunden (weil auch Elemente enthalten sind, die man nicht unbedingt am Anfang eines Programmierkurses lernt), aber eine lohnende Arbeit.

Eine Hilfe beim Verstehen des Codes kann es auch sein, wenn du gezielt an einzelnen Stellen kleine Änderungen vornimmst, dir ansiehst, wie sich das auf das Ergebnis auswirkt und das dann analysierst.
Dorfl
User
Beiträge: 17
Registriert: Sonntag 23. November 2008, 17:18

Beitragvon Dorfl » Mittwoch 17. Dezember 2008, 20:55

^^ jo hab das auch gemacht und gesehn wo man sich einiges erleichtern kann :) es gibt zwar noch einige dinge die ich noch nicht ganz nachvollziehen kann aber arbeite drann :)

Wer ist online?

Mitglieder in diesem Forum: r.barrios