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
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
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?

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!

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
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!
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