Bild Datei bei Tkinter verwenden!!!!!!!!!!!!!

Fragen zu Tkinter.
Nic_Kobrasi@web.de
User
Beiträge: 27
Registriert: Donnerstag 13. August 2015, 10:00

sry ich dachte das Forum währe dafür da, dass man etwas fragen darf wenn man es nicht weiß...
War ich etwa unfreundlich ? wenn ja dann entschuldigung war keine Absicht. :D
hast du zufällig kurz diee Zeit den code mal so umzuschreiben wie du ihn schreiben würdest ? Wenn ja dann vielen dank wenn nein dann könntest du nochmal für nen Idioten erklären wie das mit der Bilddatei genau geht ?
lg Nicolai
Nic_Kobrasi@web.de
User
Beiträge: 27
Registriert: Donnerstag 13. August 2015, 10:00

(Idiot = Ich)
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Niemand hier kennt deine Anforderungen, also kann niemand die Entscheidung fuer dich treffen oder auch nur ernsthafte Empfehlungen geben.

Und zum Forum: Ja, wir sind hier um Fragen zu beantworten, Hilfen zu geben und fuer generelle Diskussionen offen. Das heisst aber nicht, dass wir eine Suchmaschine ersetzen koennen oder wollen.

Aber ich will mal nicht so sein. Das Python Wiki hat hier eine Aufzaehlung bei der du starten kannst: https://wiki.python.org/moin/UsefulModules#GUI
Nic_Kobrasi@web.de
User
Beiträge: 27
Registriert: Donnerstag 13. August 2015, 10:00

danke für die Antwort ich habe schon mermals gegoogelt und nichts gefunden deshalb habe ich mich erst dazu entschlossen mich hier anzumelden und mal zu fragen
Nic_Kobrasi@web.de
User
Beiträge: 27
Registriert: Donnerstag 13. August 2015, 10:00

ich versuche es nochmal und schildere mein Problem mal ausführlicher:

Code: Alles auswählen

from tkinter import * #für das modul tkinter
import random
import time


class Figur:                                       #ich will eine kleine Strichmänchen Figur auf den Bildschirm bringen die sich nach links und rechts bewegen kann.
    def __init__(self,canvas):
        self.canvas = canvas
        self.id= PhotoImage(file =r"C:\Users\Nicolai\Desktop\Python lernen\Unbenannt.png") #hier will ich die Datei ins Program laden, aber das Canvas bleibt leer 
        self.canvas.move(self.id, 245, 100)
        self.x = -3
        self.y = -3
        self.canvas_height = self.canvas.winfo_height()
        self.canvas_width = self.canvas.winfo_width()




tk = Tk()                                                       #das Fenster erschaffen
tk.title("Stickmans' Adeventure")                        #den Namen dafür
tk.resizable(1, 1)
tk.wm_attributes("-topmost", 1)
canvas = Canvas(tk, width=500, height=500, bd=0, highlightthickness=0)
canvas.pack()
tk.update()

F = Figur(canvas)                                           #hier das Atribut F für figur 

label = Label(image=r"C:\Users\Nicolai\Desktop\Python lernen\Unbenannt.png")             #hier der text der mier zuvor empfohlen wurde allerdings mache ich warscheinlich etwas damit Falsch da es die 
label.image = r"C:\Users\Nicolai\Desktop\Python lernen\Unbenannt.png"                       #Fehlermeldung (siehe unten) ausgiebt allerdings gibt es die Datei ganz sicher
label.pack()     


while 1:
    tk.update_idletasks()
    tk.update()
    time.sleep(0.01)                                                                                             #die Updateschleife

Die Fehlermeldung:Traceback (most recent call last):
File "C:\Users\Nicolai\Desktop\Python lernen\game anfang.py", line 29, in <module>
label = Label(image=r"C:\Users\Nicolai\Desktop\Python lernen\Unbenannt.png")
File "C:\Python34\lib\tkinter\__init__.py", line 2604, in __init__
Widget.__init__(self, master, 'label', cnf, kw)
File "C:\Python34\lib\tkinter\__init__.py", line 2122, in __init__
(widgetName, self._w) + extra + self._options(cnf))
_tkinter.TclError: image "C:\Users\Nicolai\Desktop\Python lernen\Unbenannt.png" doesn't exist




das Programm soll wie gesagt die Figur mit a und d nach links oder rechts laufen lassen.
wenn mir jemand einfah meine Fehler erklärt und sagt was ich stattdessen schreiben sollte sagt wäre ich demjenige/denjenigen sehr dankbar, da ich python echt toll finde und gerne etwas damit machen würde (ich hab sonst keine erfahrung im Programieren außer minnimal C++)
Nic_Kobrasi@web.de
User
Beiträge: 27
Registriert: Donnerstag 13. August 2015, 10:00

lg Nicolai
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Also zuerst wäre es gut, die Fehlermeldung zu lesen und versuchen die Bedeutung zu verstehen? Existiert die Datei? Wahrscheinlich schon, weil Du sonst nicht nach dem Fehler so lange suchen würdest. Ist diese Datei ein PhotoImage? Du denkst das schon. Aber PhotoImage denkt das nicht. Siehe: http://effbot.org/tkinterbook/photoimage.htm

GIF und PGM gehen. Dass PNG auch geht. Davon steht da nichts.

PS: Man darf nichts glauben. Solange man glaubt, dass eine PNG Datei ein PhotoImage ist, wird man den Fehler nicht finden.

Ist natürlich auch eine schlampig formulierte Fehlermeldung. Hätten schreiben können, dass die Datei existiert, aber kein Photoimage ist.
Nic_Kobrasi@web.de
User
Beiträge: 27
Registriert: Donnerstag 13. August 2015, 10:00

vielen Dank für die Antwort :D ich werde es so versuchen
Nic_Kobrasi@web.de
User
Beiträge: 27
Registriert: Donnerstag 13. August 2015, 10:00

geht immer noch nicht hab es mit gif und pgm versucht beides selber Fehler wie davor

Code: Alles auswählen

from tkinter import *
import random
import time


class Figur:
    def __init__(self,canvas):
        self.canvas = canvas
        self.id= PhotoImage(file =r"C:\Users\Nicolai\Desktop\Python lernen\Stickman_stand.gif")
        self.canvas.move(self.id, 245, 100)
        self.x = -3
        self.y = -3
        self.canvas_height = self.canvas.winfo_height()
        self.canvas_width = self.canvas.winfo_width()




tk = Tk()
tk.title("Stickmans' Adeventure")
tk.resizable(1, 1)
tk.wm_attributes("-topmost", 1)
canvas = Canvas(tk, width=500, height=500, bd=0, highlightthickness=0)
canvas.pack()
tk.update()

F = Figur(canvas)

label = Label(image=r"C:\Users\Nicolai\Desktop\Python lernen\Stickman_stand.gif")
label.image = r"C:\Users\Nicolai\Desktop\Python lernen\Stickman_stand.gif"
label.pack()


while 1:
    tk.update_idletasks()
    tk.update()
    time.sleep(0.01)



Fehler:
Traceback (most recent call last):
File "C:\Users\Nicolai\Desktop\Python lernen\game anfang.py", line 29, in <module>
label = Label(image=r"C:\Users\Nicolai\Desktop\Python lernen\Stickman_stand.gif")
File "C:\Python34\lib\tkinter\__init__.py", line 2604, in __init__
Widget.__init__(self, master, 'label', cnf, kw)
File "C:\Python34\lib\tkinter\__init__.py", line 2122, in __init__
(widgetName, self._w) + extra + self._options(cnf))
_tkinter.TclError: image "C:\Users\Nicolai\Desktop\Python lernen\Stickman_stand.gif" doesn't exist


ich weiß echt nicht weiter :K :K :K das verwirrt mich sehr
PS. wenn ich ab morgen nicht mehr antworte bin ich bis mitwoch weg nicht wundern
Nic_Kobrasi@web.de
User
Beiträge: 27
Registriert: Donnerstag 13. August 2015, 10:00

ich habe hier noch einen anderen Code der aus dem Lehrbuch stammt das ich gelesen habe, dort wird auch der sternchen import genutzt.Warum ist dieser Falsch und was sollte ich statdessen machen ?

Code: Alles auswählen

from tkinter import *
import random
import time

     

class Ball:
     def __init__(self, canvas, paddle, color,):
         self.canvas = canvas
         self.paddle = paddle
         self.id = canvas.create_oval(10, 10, 25, 25, fill=color)
         self.canvas.move(self.id, 245, 100)
         starts = [-3, -2, -1, 1, 2, 3]
         random.shuffle(starts)
         self.x = starts[0]
         self.y = -3
         self.canvas_height = self.canvas.winfo_height()
         self.canvas_width = self.canvas.winfo_width()
         self.hit_bottom = False


     def hit_paddle(self, pos):
          paddle_pos = self.canvas.coords(self.paddle.id)
          if pos[2] >= paddle_pos[0] and pos[0] <= paddle_pos[2]:
               if pos[3] >= paddle_pos[1] and pos[3] <= paddle_pos[3]:
                    self.x += self.paddle.x
                    return True
               return False
          

     def draw(self):
         self.canvas.move(self.id, self.x, self.y)
         pos = self.canvas.coords(self.id)
         if pos[1] <= 0:
             self.y = 3
         if pos[3] >= self.canvas_height:
              self.hit_bottom = True
         if self.hit_paddle(pos) == True:
              self.y= -3
         if pos[0] <= 0:
             self.x = 3
         if pos[2] >= self.canvas_width:
             self.x = -3

class Paddle:
     def __init__(self, canvas, color):
          self.canvas = canvas
          self.id = canvas.create_rectangle(0, 0, 100, 10, fill=color)
          self.canvas.move(self.id, 200, 300)
          self.x = 0
          self.canvas_width = self.canvas.winfo_width()
          self.canvas.bind_all('<KeyPress-Left>', self.turn_left)
          self.canvas.bind_all('<KeyPress-Right>', self.turn_right)


     def draw(self):
          self.canvas.move(self.id, self.x, 0)
          pos = self.canvas.coords(self.id)
          if pos[0] <= 0:
               self.x = 0
          elif pos[2] >= self.canvas_width:
               self.x = 0


     def turn_left(self, evt):
          self.x = -2
     def turn_right(self, evt):
          self.x = 2
         

          

tk = Tk()
tk.title("Game")
tk.resizable(1, 1)
tk.wm_attributes("-topmost", 1)
canvas = Canvas(tk, width=500, height=500, bd=0, highlightthickness=0)
canvas.pack()
tk.update()

paddle = Paddle(canvas, 'blue') 
ball = Ball(canvas, paddle, 'red')
game_over_text = canvas.create_text(250, 200, text='GAMEOVER', state='hidden')

while 1:
     if ball.hit_bottom == False:
        ball.draw()
        paddle.draw()
        if ball.hit_bottom == True:
             time.sleep(1)
             canvas.itemconfig(game_over_text, state='normal')
        tk.update_idletasks()
        tk.update()
        time.sleep(0.02)

wie gesagt der code funktioniert nur das dort kein Photo image verwendet wird.
Nic_Kobrasi@web.de
User
Beiträge: 27
Registriert: Donnerstag 13. August 2015, 10:00

Noch eine Frage sollte ich für so ein schon spiele ähnliches Programm vieleicht etwas anderes als tkinter nehmen (pygame geht bei python 3.4.3 glaub ich nicht)
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Alfons Mittelmeyer hat geschrieben:PS: Man darf nichts glauben. Solange man glaubt, dass eine PNG Datei ein PhotoImage ist, wird man den Fehler nicht finden.
Ist vielleicht etwas kryptisch. Das `image` Argument von `Label` erwartet ein `PhotoImage` Objekt, keinen Pfad.

Dementsprechend muss es so aussehen:

Code: Alles auswählen

label = Label(image=PhotoImage(file=path))
Auf der verlinkten Website gibt es auch noch eine Moeglichkeit andere Dateiformate zu benutzen. Statt PIL gibt es nun aber Pillow.
Nic_Kobrasi@web.de
User
Beiträge: 27
Registriert: Donnerstag 13. August 2015, 10:00

danke für alle antworten ich habe es mit dem beschriebenen Weg versucht nun wird auch kein error mehr angezeigt aber das canvas bleibt leer (die gif datei funktioniert garantiert aber wird halt wieder nicht angezeigt)

Code: Alles auswählen

from tkinter import *
import random
import time

class Figur:
    def __init__(self,canvas):
        self.canvas = canvas
        self.id= PhotoImage(file =r"C:\Users\Nicolai\Desktop\Python lernen\Stickman_stand.gif")
        self.canvas.move(self.id, 245, 100)
        self.x = -3
        self.y = -3
        self.canvas_height = self.canvas.winfo_height()
        self.canvas_width = self.canvas.winfo_width()




tk = Tk()
tk.title("Stickmans' Adeventure")
tk.resizable(1, 1)
tk.wm_attributes("-topmost", 1)
canvas = Canvas(tk, width=500, height=500, bd=0, highlightthickness=0)
canvas.pack()
tk.update()

F = Figur(canvas)

label = Label(image=PhotoImage(file=r"C:\Users\Nicolai\Desktop\Python lernen\Stickman_stand.gif"))
label.image = r"C:\Users\Nicolai\Desktop\Python lernen\Stickman_stand.gif"
label.pack()


while 1:
    tk.update_idletasks()
    tk.update()
    time.sleep(0.01)

ach ja ihr habt noch gesagt das ich sternchenimporte lassen sollte wie soll ich das dann importieren ? :K :K :K ich hab das aus dem lehrbuch das ich gelesen hab bei tkinter nur so gelernt
Sirius3
User
Beiträge: 18265
Registriert: Sonntag 21. Oktober 2012, 17:20

@Nic_Kobrasi@web.de: man importiert entweder die Namen, die man braucht, oder importiert das Modul an sich und greift auf die Klassen über den Modulnamen zu. Üblicherweise wird dann tkinter als tk abgekürzt. Du musst für Dein Canvas schon auch ein Image erzeugen. Dann packst Du den restlichen Code noch in eine main-Funktion und schon hat man eine Basis, mit der man weiter machen kann:

Code: Alles auswählen

import tkinter as tk
import random
import time

IMAGENAME = r"C:\Users\Nicolai\Desktop\Python lernen\Stickman_stand.gif"

class Figur:
    def __init__(self, canvas, img):
        self.canvas = canvas
        self.img = img
        self.img_id = self.canvas.create_image(0, 0, image=img)
        self.canvas.move(self.img_id, 245, 100)
        self.x = -3
        self.y = -3
        self.canvas_height = self.canvas.winfo_height()
        self.canvas_width = self.canvas.winfo_width()

def main():
    root = tk.Tk()
    root.title("Stickmans' Adeventure")
    root.resizable(1, 1)
    root.wm_attributes("-topmost", 1)
    canvas = tk.Canvas(root, width=500, height=500, bd=0, highlightthickness=0)
    canvas.pack()

    img = tk.PhotoImage(file=IMAGENAME)
    figure = Figur(canvas, img)

    label = tk.Label(root, image=img)
    label.image = img
    label.pack()
    root.mainloop()

if __name__ == '__main__':
    main()
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Vergiss das mal, was Dir da manche über Sternchenimporte sagen. Wenn man mit tkinter arbeitet, dann will man auch damit arbeiten. Da finde ich es absolut richtig wenn man da tkinter mit sternchen importiert.

Jetzt wollte ich Dir raten, dass Du create_image verwendest, das hatte mittlerweile aber sirius3 schon getan. Woher soll sonst ein Image entstehen. Wenn Du einen Text in einem Canvas ausgeben willt, dann reicht es auch nicht, wenn Du schreibst: mytext='Diesen Text will ich ausgeben. Aber er erscheint so nicht'
Nic_Kobrasi@web.de
User
Beiträge: 27
Registriert: Donnerstag 13. August 2015, 10:00

wo muss das create image dann hin da es ja eine unterfunktion einer klasse ist?!?!
Sirius3
User
Beiträge: 18265
Registriert: Sonntag 21. Oktober 2012, 17:20

@Alfons Mittelmeyer: ich glaube, ich hatte Dir schon in einem anderen Thread über die Nachteile von *-Importen aufgeklärt.

@Nic_Kobrasi@web.de: das Problem mit *-Importen ist, dass Du Dir nicht nur die Klassen in den eigenen Namensraum reinlädst, die Du brauchst, und an die Du gerade denkst, wie z.B. Tk oder Label oder Button, sondern auch Zeugs, von dem Du noch nie gehört hast. Manche Namen sind so allgemein, dass sie mit großer Wahrscheinlichkeit auch in anderen Modulen verwendet werden, und welche Funktion soll dann genommen werden?
Gerade wenn Du mit Bildern arbeiten willst, importierst Du irgendwann einmal Pillow. Sowohl Pillow als auch Tk haben ein Objekt mit dem Namen Image. Wie viele Pakete gibt es, die die Konstante TRUE definieren? Manche als 1 manche als -1. Du kommst irgendwann auf die Idee, eine eigene Funktion mit dem Namen getint zu schreiben, und wunderst Dich, dass die nie aufgerufen wird, weil getint von Tk genommen wird.
Das sind nur ein paar Beispiele, warum *-Importe Probleme bereiten können und ich hatte schon Code, wo ich solche Fehler stundenlang gesucht habe.
Ich bevorzuge die oben gezeigte Variante, weil drei Buchstaben mehr beim Tippen nicht stören und ich so immer gleich sehe, was von Tk kommt.

EDIT: wo create_image hin muß, habe ich Dir doch gezeigt. Ansonsten gibt es auch noch eine Dokumentation zu Canvas.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Nein, wenn man mit Tkinter arbeitet will man absolut keinen Stern-Import:

Code: Alles auswählen

In [1]: len(globals())
Out[1]: 20

In [2]: from Tkinter import *

In [3]: len(globals())
Out[3]: 202
Tk (Python2) importiert 182 Namen das ist absolut nicht ueberschaubar und die Namen sind generisch genug, dass sie sich mit anderen ueberschneiden koennen.
Nic_Kobrasi@web.de
User
Beiträge: 27
Registriert: Donnerstag 13. August 2015, 10:00

ok danke für die antworten als ich das geschrieben habe mit wo muss das hin habe ich deinen anderen post nicht gesehen vielen dank ich werde es mal damit probieren
Nic_Kobrasi@web.de
User
Beiträge: 27
Registriert: Donnerstag 13. August 2015, 10:00

ich habe den code so geschrieben wie do oben gesagt hast nun erscheint kein Error mehr aber die figur ist zweimal auf dem Canvaseinmal ganz oben und ganz unten heißt das, dass er das Objekt 2 mal kreiert hat oder das das ein hintergrund image ist, da sich das ja am ende nach liks und rechts bewegen würde wäre das nicht so gut.
Ps da sind viele Funktionen drinnen die ich nicht kenne war das Lehrbuch wohl doch nicht so der knüller :D (es heißt Python kinderleicht kennt jemand dieses Buch und weiß er ob es gut ist oder ob ich das alles liber wieder vergessen sollte und wenn ja welche andere Methode( am besten nicht auf english gibt es noch python zu lernen))

lg Nicolai
Antworten