Seite 1 von 1

Adventskalender

Verfasst: Sonntag 4. Dezember 2011, 21:06
von jtschoch
Hi,

Ich habe mal angefangen einen vitualen Adventskalender zu programmieren.
Es ging eigentlich sehr gut, außer der Fehlermeldung:

Code: Alles auswählen

/home/jtschoch/Prog/python/Kalender
Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1413, in __call__
    return self.func(*args)
  File "./Kalender.py", line 61, in <lambda>
    vier = Button(root, text = "4", command = lambda: tuer(4))
  File "./Kalender.py", line 35, in tuer
    bild_tuer = Label(inhalt, image=tuer_img)
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 2478, in __init__
    Widget.__init__(self, master, 'label', cnf, kw)
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1977, in __init__
    (widgetName, self._w) + extra + self._options(cnf))
TclError: image "pyimage2" doesn't exist
Der Programmcode hier

Ich hoffe ihr könnt mir Helfen!

Re: Adventskalender

Verfasst: Sonntag 4. Dezember 2011, 21:30
von webspider
So, anfangs verwirrte mich, dass der Fehler erst bei Tag 4 auftritt. Aber das ist ja an sich selbstverständlich wenn man bedenkt, dass wir heute den 4. Dezember haben :mrgreen:

Der Fehlermeldung zufolge scheint das Bildchen nicht erstellbar sein. Vielleicht weil im aktuellem Verzeichnis kein 4.gif existiert?

Re: Adventskalender

Verfasst: Sonntag 4. Dezember 2011, 22:37
von jtschoch
Doch es exestiert alles,
das verwundert mich!

Re: Adventskalender

Verfasst: Sonntag 4. Dezember 2011, 23:22
von webspider
Alternativ: Bringt es was wenn du in der besagten Zeile die Teilpfade per os.path.join() verbindest wie hier empfohlen wird?

Re: Adventskalender

Verfasst: Sonntag 4. Dezember 2011, 23:50
von JonasR
Das Problem wird sein dass Zeile 29 nicht korrekt ist ;) Denk mal drüber nach was da passiert :D

Edit... Uhm gar nicht gesehen dass du day in Zeile 28 auf 1 setzt...

Edit 2:
Also Zeile 28, 29 sind mir unschlüssig... Wozu benutzt du da die if-abfrage?
Und wieso day=1

Code: Alles auswählen

        def tuer(tag): 
            day = int(time.strftime("%d"))
            if tag == day:
                    inhalt = Tk()
                    inhalt.title("Kalender - Tür %s" % str(day))
                    print "%s. Advend" % day
                    img_path = os.path.join(os.getcwd(), "images", "%s.gif" % str(day))
                    print img_path
                    tuer_img = PhotoImage(file=img_path)
                    bild_tuer = Label(inhalt, image=tuer_img)      
                    bild_tuer.photo = tuer_img
                    bild_tuer.pack()
           
 
                    inhalt.mainloop()
           
            else:
                tkMessageBox.showwarning("Kalender - Info", "Na, wer ist da zu voreilig?")
Ist das besser? :D Kenne mich btw nicht mit tkinter aus

Re: Adventskalender

Verfasst: Montag 5. Dezember 2011, 16:28
von Hyperion
Was zum Geier bringt Dir ein `os.getcwd`? Wozu soll das gut sein?

Von der Nicht-Eleganz der Türchen mal nicht zu sprechen...

Generell erkennt man in dem Code keinerlei Entwicklung - mag daran liegen, dass Du Dir Tipps und Hinweise nie zu Herzen nimmst? Die Zeilen 50-90 sind reines Copy-and-Paste-Programming!

Zum eigentlichen Problem hat JonasR ja schon einiges geschrieben und ich bin kein Tk-Experte.

Re: Adventskalender

Verfasst: Montag 5. Dezember 2011, 20:58
von kaytec
Hallo jtschoch !

Du hast zwei "mainloop" das wird eventuell auch funktionieren, doch ein zweites Fenster leitet man von root als Toplevel ab --> parent --> child - wird dazu gesagt - glaub ich mal !?

Du hast mit grosser Wahrscheinlichkeit keine Referenz mehr auf das Bild und deshalb findet es Tkinter nicht. Ich würde eine Klasse erstellen und mit self.tuer_img eine solche erzeugen, dann sollte es klappen.

Hier im Forum findet man auch andere Lösungen --> http://www.python-forum.de/viewtopic.ph ... 9&p=110476

Desweiteren würde ich die Bilder komplett in eine Liste einlesen und über diese iterieren, damit ist auch die Erzeugung der Buttons kein Problem mehr.

Gruß Frank

Re: Adventskalender

Verfasst: Montag 5. Dezember 2011, 22:03
von jtschoch
@kaytec:

Danke für den Hinweis es Funktioniert mit Toplevel! :D

Re: Adventskalender

Verfasst: Montag 5. Dezember 2011, 22:35
von jtschoch
@Hyperion

das os.getcwd war nur zum Test ob das ma Pfad liegt.

Und wie soll ich das untere Teil sonst malchen Schleife?
in eine liste die Position geben?

Ich beantworte es mal selber mit JA!

Re: Adventskalender

Verfasst: Montag 5. Dezember 2011, 22:56
von Newcomer
Und ist es nicht schlechter stil jeden tag in eine neue variable zu speichern??? Dazu kann man doch auch dicts verwenden oder?

Re: Adventskalender

Verfasst: Dienstag 6. Dezember 2011, 05:57
von kaytec
Hallo Newcomer !

Na dicts haben ein eigenes Sortierverhalten und sind im Zugriff nicht so schnell wie eine Schleife. Er hat mit einer Liste keine einzelnen Variablen für jeden Tag, sondern er kann mit enumerate(liste) die Tage numerieren und somit auch Tkinter die images übergeben.

Gruß Frank

Re: Adventskalender

Verfasst: Dienstag 6. Dezember 2011, 17:01
von jtschoch
Ich weiß aber leider nicht wie ich das Alles in eine Schleife bekomme.

Code: Alles auswählen

werte = ["1", 40, 20;
                        "2" ...]
for name, x,y in werte:
     # restcode
oder soll ich das mit () machen also

Code: Alles auswählen

werte = (x = 54, y = 23)
Zahlen # Mit schleife gernerieren

Funktioniert aber nicht!

Kann mir jemand Helfen?

Re: Adventskalender

Verfasst: Dienstag 6. Dezember 2011, 17:48
von Hyperion
jtschoch hat geschrieben: Funktioniert aber nicht!
Das hatten wir doch nun schon zum 100. Mal :roll:

Das sind Grundlagen - du schreibst da Sachen, die einfach kein Python sind. Hast Du schon mal ein Semikolon als syntaktisches Element zur Strukturierung von Listen / Dictionaries gesehen? Arbeite doch mal endlich das offizielle Turorial durch. So werden Dir auf Dauer die Helfer ausgehen...

Aber mal als Tipp: Du kannst in Listen alle möglichen Objekte speichern - also auch Tupel, andere Listen, Dictionaries, ...

Re: Adventskalender

Verfasst: Dienstag 6. Dezember 2011, 18:10
von kaytec
Hallo jtschoch !

Code: Alles auswählen

#!/usr/bin/env python
# coding: utf-8

import Tkinter as tk
from functools import partial

IMAGE_LISTE = (("path_1", 0, 0), ("path_2", 0, 1), 
               ("path_3", 0, 2), ("path_4", 0, 3),
               ("path_5", 0, 4), ("path_6", 1, 0),
               ("path_7", 1, 1), ("path_8", 1, 2),
               ("path_9", 1, 3), ("path_10", 1, 4))

class Gui(tk.Frame):
    def __init__(self, root):
        tk.Frame.__init__(self, root)
        row = 0
        for text, (path, row, column) in enumerate(IMAGE_LISTE):
            tk.Button(self, text = text + 1, width = 5, command = partial(
                self.open_image, path)).grid(row = row, column = column, 
                padx = 5, pady = 5)
        
    def open_image(self, path):
        print path

def main():
    root = tk.Tk()
    gui = Gui(root)
    gui.pack()
    root.mainloop()
     
if __name__ == "__main__": main()
Gruß Frank

Re: Adventskalender

Verfasst: Dienstag 6. Dezember 2011, 19:01
von jtschoch
Danke für die Antwort,
Ich habe es natürlich mit place gemacht.

Weil ich nicht so einen geraden Kalender haben will,
wie bekomme ich noch die Funktion rein, das nur bei der bestimmten zahl die ich anklicke das Bild kommt.

Code:
http://www.python-forum.de/pastebin.php?mode=view&s=257

Re: Adventskalender

Verfasst: Dienstag 6. Dezember 2011, 19:05
von jtschoch
Hat sich erledigt habe es! :D

Code: Alles auswählen

 for text, (text, x, y) in enumerate(Werte):
            zahl = Button(root, text = text, command = partial(tuer, int(text)))
            zahl.place(x = x, y = y)

Re: Adventskalender

Verfasst: Dienstag 6. Dezember 2011, 19:25
von kaytec
Hallo jtschoch !

Du überschreibst text mit text ! Das Listenelement text brauchst du nicht, denn dafür hast du ja enumerate(deine_liste). In meinem Beispiel sollte der Text deinen Pfad zu den Fotos darstellen. Du könntest über index und Datum auf Übereinstimmung prüfen. Im Falle einer Übereinstimmung den Pfad übergeben und das Foto anzeigen.

Gruß Frank

Re: Adventskalender

Verfasst: Dienstag 6. Dezember 2011, 19:55
von jtschoch
ja, gut
danke für den Tip,
ist ja eigentlich auch egal,
Funktioniert ja einbahnfrei!

Re: Adventskalender

Verfasst: Mittwoch 7. Dezember 2011, 06:35
von kaytec
Hallo jtschoch !

Zu "place" ist schon genug gesagt worden - es wird nur auf deinem Desktop gut aussehen.

Du fängst alle Fehler ab - sollte nicht sein !

Du importierst Tk doppelt ?

Und vieles mehr.

Gruß Frank