Bild vergrössern

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

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?
Sinn und Unsinn meiner Worte kommt nie von ungefähr. Das nämlich bin ich, nicht mehr.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

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
gorba
User
Beiträge: 100
Registriert: Freitag 28. Juli 2006, 14:58

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.................................................|
|_______________________________|
Sinn und Unsinn meiner Worte kommt nie von ungefähr. Das nämlich bin ich, nicht mehr.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

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
gorba
User
Beiträge: 100
Registriert: Freitag 28. Juli 2006, 14:58

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)
Sinn und Unsinn meiner Worte kommt nie von ungefähr. Das nämlich bin ich, nicht mehr.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Versuchs doch mal mit pack() statt mit grid(). Ist zwar etwas umständlicher, dafür aber flexibler.
MfG
HWK
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

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
gorba
User
Beiträge: 100
Registriert: Freitag 28. Juli 2006, 14:58

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?
Sinn und Unsinn meiner Worte kommt nie von ungefähr. Das nämlich bin ich, nicht mehr.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Code: Alles auswählen

self.bul.config(state=DISABLED)
Manchmal hilft das Lesen der "Bedienungsanleitung".
MfG
HWK
gorba
User
Beiträge: 100
Registriert: Freitag 28. Juli 2006, 14:58

hab wohl zu weit hinten angefangen zu lesen. Danke für deine Hilfe
Sinn und Unsinn meiner Worte kommt nie von ungefähr. Das nämlich bin ich, nicht mehr.
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

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.
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Antworten