Adventskalender

Fragen zu Tkinter.
Antworten
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

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!
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

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?
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

Doch es exestiert alles,
das verwundert mich!
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Alternativ: Bringt es was wenn du in der besagten Zeile die Teilpfade per os.path.join() verbindest wie hier empfohlen wird?
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

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
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

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
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

@kaytec:

Danke für den Hinweis es Funktioniert mit Toplevel! :D
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

@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!
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
Newcomer
User
Beiträge: 131
Registriert: Sonntag 15. Mai 2011, 20:41

Und ist es nicht schlechter stil jeden tag in eine neue variable zu speichern??? Dazu kann man doch auch dicts verwenden oder?
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

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
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

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?
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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, ...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

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
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

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
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

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)
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

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
Benutzeravatar
jtschoch
User
Beiträge: 400
Registriert: Freitag 6. Mai 2011, 15:40
Kontaktdaten:

ja, gut
danke für den Tip,
ist ja eigentlich auch egal,
Funktioniert ja einbahnfrei!
Meine Webseite http://www.develos.de
Forum: http://www.develos.de/forum
Mein Minecraft-Server: jonel.minecraft.to [dynmap(:8123)] | Webseite: http://jonel-minecraft.tk
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

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
Antworten