Seite 1 von 1

Bild vergrössern

Verfasst: Mittwoch 20. September 2006, 14:00
von gorba
Hallo

Ich möchte gern ein Bild 4 fach vergrössert darstellen, nur hab ich keine ahnung, wie ich das anstellen soll....

Code: Alles auswählen

		im = Image.open( strIO.StringIO(buffer) ) 
		self.photo = ImageTk.PhotoImage(im)
		self.label.config(image = self.photo)
		self.update()
Ich dachte so könnts klappen:

Code: Alles auswählen

		self.photo = ImageTk.PhotoImage('L', (height*4, width*4))
		self.photo.paste(buffer, None)
aber das funktioniert nicht :( Kann mir jemand weiterhelfen?

Verfasst: Mittwoch 20. September 2006, 21:38
von HWK

Code: Alles auswählen

        im = Image.open(strIO.StringIO(buffer))
        im = im.resize(width * 4, height * 4)
        self.photo = ImageTk.PhotoImage(im)
        self.label.config(image=self.photo)
        self.update()
MfG
HWK

Verfasst: Montag 25. September 2006, 11:09
von gorba
ach so geht das. thx

Wo ich auch noch anstehe, ist, wenn ich folgende Strucktur habe:

__________________
| Zelle 1.....| Zelle 2.....|
|________|________|
| Zelle 3.......................|
|_________________|

Wenn nun in Zelle 3 ein Bild ist, dass grösser wird, verschiebt es mir Zelle 2 nach rechts und es gibt einen Abstand zwischen Zelle 1 und 2. Kann ich irgendwie festlegen, dass einfach die Zelle 2 rechts wächst, aber der Anstand zwischen 1 und 2 immer gleich bleibt? So in der art:

________________________________
| Zelle 1.....| Zelle 2.................................|
|________|______________________|
| Zelle 3.................................................|
|_______________________________|

Den im moment sieht das ganze so aus: (was nicht gerade ideal ist)

________________________________
| Zelle 1...................| Zelle 2..................|
|_______________|_______________|
| Zelle 3.................................................|
|_______________________________|

Verfasst: Montag 25. September 2006, 12:08
von HWK
Mit etwas Beispiel-Code (möglichst lauffähig) wäre es einfacher, zu sehen, wo der Fehler liegt. Häufig ist es hilfreich, Zellen (hier 1 + 2) in einen Frame zu legen. Du solltest auch mit den pack()-Optionen fill und expand etwas probieren. Dann müßte sich eine Möglichkeit finden lassen, die den gewünschten Effekt liefert, z.B. Zelle 1 ohne expand und Zelle 2 mit.
MfG
HWK

Verfasst: Montag 25. September 2006, 12:49
von gorba

Code: Alles auswählen

		Button(root,text="Exit",command=self.quit, width=10).grid(row=0, column=0, sticky=W)
		Button(root,text="Transmit",command=self.send_em, width=10).grid(row=0, column=1, sticky=W, padx=5)
		Button(root,text="Zoom in",command=self.zoomIn, width=10).grid(row=1, column=0, sticky=W, padx=0, pady=5)
		Button(root,text="Zoom out",command=self.zoomOut, width=10).grid(row=1, column=1, sticky=W, padx=5)
		self.label = Label(root, image=self.photo)
		self.label.grid(row=2, column=0, columnspan=3)
wenn nun das label mit dem bild drin grösser wird, verschieben sich meine buttons leider.

habs nun so gefixt. (is sicher keine saubere lösung, aber sie tut..

Code: Alles auswählen

		Button(root,text="Exit",command=self.quit, width=10).grid(row=0, column=0, sticky=W)
		Button(root,text="Transmit",command=self.send_em, width=10).grid(row=0, column=1, sticky=W, padx=5)
		Button(root,text="Zoom in",command=self.zoomIn, width=10).grid(row=1, column=0, sticky=W, padx=0, pady=5)
		Button(root,text="Zoom out",command=self.zoomOut, width=10).grid(row=1, column=1, sticky=W, padx=5)
		
		self.void = Label(root, width=151)
		self.void.grid(row=0, column=2)
		
		self.label = Label(root, image=self.photo)
		self.label.grid(row=2, column=0, columnspan=3)

Verfasst: Montag 25. September 2006, 19:14
von HWK
Versuchs doch mal mit pack() statt mit grid(). Ist zwar etwas umständlicher, dafür aber flexibler.
MfG
HWK

Verfasst: Montag 25. September 2006, 20:40
von HWK
Ich hab's mal probiert. Hast Du an so etwas gedacht?

Code: Alles auswählen

from Tkinter import *

for width in (50, 75, 100):
    root=Tk()
    frame1 = Frame(root)
    frame1.pack(fill=X)
    Button(frame1, text="Exit", width=10).pack(side=LEFT, padx=5) 
    Button(frame1, text="Transmit", width=10).pack(side=LEFT, pady=5) 
    frame2 = Frame(root)
    frame2.pack(fill=X)
    Button(frame2, text="Zoom in", width=10).pack(side=LEFT, padx=5)
    Button(frame2, text="Zoom out", width=10).pack(side=LEFT)
    Label(root, text='Test-Label', width=width).pack()
    root.mainloop()
Mfg
HWK

Verfasst: Dienstag 26. September 2006, 10:43
von gorba
genau so! Danke, evt. werde ich noch auf pack() umsteigen. Sehe ich das richtig, dass man einen Button nicht locken kann? (mit grid)
ich habs auch schon so versucht:

Code: Alles auswählen

self.bu1.state = DISABLED
aber das scheint nicht zu klappen. Sollte doch möglich sein einen button zu disablen nich?

Verfasst: Dienstag 26. September 2006, 13:29
von HWK

Code: Alles auswählen

self.bul.config(state=DISABLED)
Manchmal hilft das Lesen der "Bedienungsanleitung".
MfG
HWK

Verfasst: Dienstag 26. September 2006, 14:07
von gorba
hab wohl zu weit hinten angefangen zu lesen. Danke für deine Hilfe

Verfasst: Samstag 4. November 2006, 17:29
von Michael Schneider
Hi Gorba,

der Grid-Geometriemanager passt die Zellen an das breiteste und höchste Widget an... es sei denn man sagt ihm, dass er das nicht machen soll:

Code: Alles auswählen

from Tkinter import *
tk = Tk()
tk.grid_propagate(False)    ##  Groesse nicht anpassen
Label(tk, text = "hallo welt").grid()
tk.mainloop()
Ist also kein Grund, deswegen gleich zu Pack zu wechseln. :lol:

Zu Deinem Programm: Du kannst das Problem mit dem Canvas und Scrollbars umschiffen:

Code: Alles auswählen

from Tkinter import *
import Image, ImageTk

class Command_Frame(Frame):
    def __init__(self, root):
        Frame.__init__(self)
        Button(self,text="Exit",command=root.close, width=10).grid(row=0, column=0)
        Button(self,text="Transmit",command=root.send_em, width=10).grid(row=0, column=1, padx=5)
        Button(self,text="Zoom in",command=root.zoomIn, width=10).grid(row=1, column=0, padx=0, pady=5)
        Button(self,text="Zoom out",command=root.zoomOut, width=10).grid(row=1, column=1, padx=5)

class Image_Frame(Frame):
    def __init__(self, root, sFile):
        Frame.__init__(self)
        self.img = Image.open(sFile)
        w, h = self.img.size
        self.photo = ImageTk.PhotoImage(self.img)
        self.canvas = Canvas(self, width = w, height = h)
        self.item = self.canvas.create_image(w/2, h/2, image = self.photo)
        self.canvas.grid(row = 1, column = 1)

        self.scrollx = Scrollbar(self, orient = HORIZONTAL)
        self.scrollx.grid(row = 2, column = 1, sticky = EW)
        self.scrolly = Scrollbar(self, orient = VERTICAL)
        self.scrolly.grid(row = 1, column = 2, sticky = NS)
        self.connect_widgets()

    def connect_widgets(self):
        self.scrollx.config(command = self.canvas.xview)
        self.scrolly.config(command = self.canvas.yview)
        self.canvas.config(xscrollcommand = self.scrollx.set, yscrollcommand = self.scrolly.set)

    def resize(self, fZoom):
        w, h = self.img.size
        wRes, hRes = int(w*fZoom), int(h*fZoom)
        self.photo = ImageTk.PhotoImage(self.img.resize((wRes, hRes)))
        self.canvas.delete(self.item)
        self.canvas.create_image(max(w, wRes)/2, max(h, hRes)/2, image = self.photo)
        self.canvas.config(scrollregion = "0 0 %i %i" % (wRes, hRes))
        return fZoom

class FRAME(Frame):
    def __init__(self, sFile):
        Frame.__init__(self)
        self.fZoom = 1.0

        ##  Befehl-Frame laden und anzeigen
        self.CommandFrame = Command_Frame(self)
        self.CommandFrame.grid(row = 1, column = 1, sticky=W)

        ##  Image laden und anzeigen
        self.ImageFrame = Image_Frame(self, sFile)
        self.ImageFrame.grid(row = 2, column = 1)

    def send_em(self): print "senden"
    def zoomIn(self): self.fZoom = self.ImageFrame.resize(self.fZoom * 1.4)
    def zoomOut(self): self.fZoom = self.ImageFrame.resize(self.fZoom / 1.4)        
    def close(self): self.master.destroy()

F = FRAME(Bildname)    ## <- Hier den Bildnamen uebergeben
F.grid()
F.mainloop()
Ich habe vor kurzem einen Viewer geschrieben, der so ähnlich funktionierte.