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.
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 ...