Bild Platzieren

Fragen zu Tkinter.
Antworten
gorba
User
Beiträge: 100
Registriert: Freitag 28. Juli 2006, 14:58

Donnerstag 3. August 2006, 08:41

Hi wenn ich im Programm unten 2x auf den Picture Button drücke, hängt es das neue Bild unter dem alten an, wie kann ich es so schrieben, dass das Bild jedesmal an der gleichen stelle erscheint?

Code: Alles auswählen

from Tkinter import *
import Image, ImageTk
	
class MyClass(Frame):
    def __init__(self, parent, master=None):
	
	
	Frame.__init__(self, master) 
        self.grid()
	im = Image.open('hw1.pgm')		# actually in dir:   hw.jpg , hw0.jpg , hw1.pgm
        im.thumbnail((280, 300), Image.ANTIALIAS)
        self.photo = ImageTk.PhotoImage(im)  # <--
	Button(root,text="Quit",command=self.quit).pack()
        Button(root,text="Bild",command=self.show_n).pack()

    def show_n(self):
        Label(root, image=self.photo).pack()  # <--

root=Tk()
root.title("Thumbnail")
my_class = MyClass(root)
root.mainloop() 
thx für alle antworten. greez
Benutzeravatar
Michael Schneider
User
Beiträge: 567
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

Donnerstag 3. August 2006, 09:05

Hi gorba,

ich bin mir nicht ganz sicher, was Du beabsichtigst. Warum möchtest Du, dass bei erneutem Klick dasselbe Bild an derselben Stelle erscheint? Wenn es nur ums Resultat geht, wäre vielleicht Nichtstun die beste Lösung. ;-)

Aber im Ernst, nach dem Code ist es plausibel, dass Du mit jedem Klick ein neues Label mit demselben Bild anlegst, die dann mit auf den Frame gepackt werden.

Wenn Du die in Zeile 11 benannten Bilder durchgehen möchtest, empfiehlt sich eine Methode, die die Bilder lädt und dann der image-Ressource des Labels zuweist. Wenn Du nur das Label in den Frame legen willst, kommst Du da über self.children ran. Andernfalls ist es einfacher, wenn Du ihm einen Namen im Klassennamensraum gibst.

Grüße,
der Michel

p.s. Das ist eine sehr aparte Einrückung, hat das etwas zu bedeuten?
Diese Nachricht zersört sich in 5 Sekunden selbst ...
gorba
User
Beiträge: 100
Registriert: Freitag 28. Juli 2006, 14:58

Donnerstag 3. August 2006, 09:09

sry ich bin anfänger und versteh nur Banhof =S
Also, das bild wird später über eine serielle Leitung übertragen. UNd bei jedem klich auf Picture wird später ein neues Bild Im Verzeichniss abgespeichert, ich denke das ganze bringe ich auch hin, aber die frage ist, wie ich (wenn das neue Bild dan übertragen wurde und abgespeichert ist) an der gleichen stelle wie das alte Bild erscheinen lassen kann.
Benutzeravatar
Michael Schneider
User
Beiträge: 567
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

Donnerstag 3. August 2006, 10:10

Hi gorba,

hier mal mein Vorschlag. Das Programm zeigt bei Knopfdruck immer das Bild mit der größten laufenden Nummer im Namen hinter "hw" an:

Code: Alles auswählen

from Tkinter import *
from glob import glob
import Image, ImageTk 
    
class MyClass(Frame): 
	sImage = "" 		##	Pfad des aktuell geladenen Bildes
	photo = None		##	aktuell geladenes Bild (Raster)
		
	def __init__(self, parent, master=None): 
		Frame.__init__(self, master) 
		self.grid() 

		self.load_recent_image()
		self.create_gui()
	

	def create_gui(self):
		Button(root,text="Quit",command=self.quit).grid() 
		Button(root,text="Bild",command=self.update_label).grid() 

		self.label = Label(root, image=self.photo)
		self.label.grid()	##	bei pack hatte ich Probleme mit dem Update
	

	def load_recent_image(self):
				
		lImages = glob("hw*.jpg")						##	hole alle jpg-Bilder des akt. Verzeichnisses
		if lImages:
			lImageNumbers = map(lambda x: int(x[2:-4]), lImages)	##	laufende Nummer extrahieren
			dImages = dict(map(None, lImageNumbers, lImages))		##  dictionary der Bilder (fuer Zuweisungen)
			lImageNumbers.sort()									##  Schluessel sortieren
			sImage = dImages.get(lImageNumbers[-1]) 				##  Bild mit groesster lfd. Nummer waehlen
		else: print "keine Bilder des erforderlichen Formats gefunden"
		
		if not (self.sImage == sImage) and sImage:		##	nur wenn sich das Bild aendert
			print "lade", sImage
			self.sImage = sImage
			im = Image.open(sImage)
			im.thumbnail((280, 300), Image.ANTIALIAS)
			self.photo = ImageTk.PhotoImage(im)


	def update_label(self):
		self.load_recent_image()
		self.label.config(image = self.photo)

root=Tk() 
root.title("Thumbnail") 
my_class = MyClass(root) 
root.mainloop() 
Vielleicht hilft Dir das schon weiter, zumindest prinzipiell.

Grüße,
der Michel
Diese Nachricht zersört sich in 5 Sekunden selbst ...
gorba
User
Beiträge: 100
Registriert: Freitag 28. Juli 2006, 14:58

Donnerstag 3. August 2006, 10:47

Danke für den Gedankenanstoss. Super, auf dem kann ich aufbauen. Thx!
Antworten