Seite 1 von 1

Bildskalierung

Verfasst: Mittwoch 16. Mai 2007, 07:51
von Raio
Guten Morgen.

Ich habe folgendes Problem bei meinem Tkinter-Script:
Ich versuche mehrere Bilder in einem Fenster einer bestimmten Stelle zuzuordnen, bzw. Bilder leicht neben & unter ein anderes zu setzen. Ich habe es bereits mit "side=LEFT" & "side=BOTTOM" versucht, allerdings setzen sich die Bilder dann immernoch nicht untereinander oder so wie ich es wollen würde. Gibt es eine Möglichkeit Bildpositionen in einem Fenster genau zu bestimmen oder auf die anderen abzustimmen?

Bisher sieht das Script so aus, alle "side=BOTTOM"-Befehle die zu sehen sind, waren bisher nur Versuche:

Code: Alles auswählen

from Tkinter import *
root = Tk()

c=Canvas(root,width ="5c", height ="5c")
c.pack(side=LEFT)
bild=PhotoImage(file=r"/users/...")
c.create_image(85,80, image=bild)

c=Canvas(root,width ="5c", height ="5c")
c.pack(side=BOTTOM)
bild2=PhotoImage(file=r"/users/...")
c.create_image(15,40, image=bild2)

c=Canvas(root,width ="5c", height ="5c")
c.pack(side=BOTTOM)
bild3=PhotoImage(file=r"/users/...")
c.create_image(85,80, image=bild3)

c=Canvas(root,width ="5c", height ="5c")
c.pack(side=LEFT)
bild4=PhotoImage(file=r"/users/...")
c.create_image(85,80, image=bild4)

c=Canvas(root,width ="5c", height ="5c")
c.pack(side=LEFT)
bild5=PhotoImage(file=r"/users/...")
c.create_image(85,80, image=bild5)

root.mainloop()
Ich würde mich über eine Antwort freuen.

Verfasst: Mittwoch 16. Mai 2007, 08:01
von Zizibee
Ich hab das zwar noch nie mit Bildern gemacht, hatte aber mit pack auch so meine Probleme. Ich hab das dann über grid gelöst.
Hier ein mal ein Beispiel mit einem Eingabefeld

Code: Alles auswählen

    name = Entry(root, width=30,background='white')
    name.grid(row=0, column=1, sticky=W)
Dabei wird dein Fenster in eine art Tabelle eingeteilt und mit row und column bestimmt du Zeile und Spalte.
Wenn du hier nach grid suchst, solltest du einige Beispiele finden können!

[EDIT]
Achte darauf, dass du nicht grid und pack gleichzeitig in einer Funktion benutzen kannst!

Verfasst: Mittwoch 16. Mai 2007, 18:37
von schlangenbeschwörer
Hi Raio!
Da du die Bilder eh in Canvas'en anzeigst, kannst du das doch auch in einem machen. So kannst du es pixelgenau positionieren. Wenn du dazwischen noch was hast, kannst du die entweder mit c.create_window()
auch ins Canvas einbauen, oder das normal in einem Frame machen und alles oder nur die Bilder auf nem Label mit place() statt pack() positionieren. Das ist dann auch pixelgenau und du kannst es relativ zur Fenstergröße machen.
Zizibee hat geschrieben:Achte darauf, dass du nicht grid und pack gleichzeitig in einer Funktion benutzen kannst!
Das ist richtig, wobei es nicht davon abhängt ob man es in einer oder zwei verschiedenen Funktionen bzw. besser Methoden benutzt.
grid() ist eigentlich eine gute Zwischenlösung, da es genauer als pack() ist und auch mehr Zeilen und Spalten als Links-Mitte-Rechts bzw. Oben-Mitte-Unten zulässt, aber einfacher als place() ist, wo man besser vorher eine Zeichnung macht, wenns etwas größer werden soll.

Gruß, jj

Verfasst: Mittwoch 16. Mai 2007, 18:37
von Flano
Hallo Raio,

Ich würde für diese Aufgabe auch lieber den .grid() Layout Manager
nehmen. Wenn du ganz auf einen Pack Manger verzichten willst, kannst
du über .place() auch selbst die Koordinaten für das Canvas setzen.

Code: Alles auswählen

c = Canvas(root, width = '5c', height = '5c', bg = 'white')
c.place(x = 100, y = 150)
Ich würde den Hintergrund für das Canvas auch erst einmal mit weißem
Hintergrund versehen. So sieht man die Ausrichtung des Canvas und der Bilder
besser.

Solltest du beim .pack() Manager bleiben wollen, hilft es dir vielleicht weiter
in deinem Fenster mehrere Frames anzuordnen in denen du deine Canvas anordnest.

Gruß Flano

Verfasst: Montag 21. Mai 2007, 10:35
von Raio
Erst einmal danke für die vielen Antworten.

Das Prinzip der Vorschläge habe ich nun verstanden, allerdings ist mir nun immernoch unklar wie ich mit dieser Methode nun das Bild einfügen kann.

MfG,
Raio

Verfasst: Montag 21. Mai 2007, 13:15
von schlangenbeschwörer
Hi raio!

Du hast jetzt einige Möglichkeiten:
  • Du pazierst jedes Bild in ein eigenes Canvas
  • Du plazierst alle Bilder in ein Canvas
  • Du plazierst jedes Bild auf ein eigenes Label
Wenn du alles in ein Canvas packst, plazierst du die Bilder wie oben auch schon mit den ersten zwei Argumenten.
---
Wenn du jedes Bild in ein eigenes Canvas packst, gibts du immer die Coords (0,0) an, damit man keinen Rand vom Canvas sieht.

Code: Alles auswählen

bild=PhotoImage(file=r"/users/...")
deinBildCanvas=Canvas()
# *)
deinBild = c.crate_image(0,0, image=bild)
Wenn du jedes Bild in auf ein Label packst, ist's noch leichter:

Code: Alles auswählen

bild=PhotoImage(file=r"/users/...")
deinBildLabel = tk.Label(image=bild)
# *)
So, nun musst du nur noch die Canvases oder Labels plazieren.
Das machst du, wie oben schon gesagt, entweder mit grid oder place.
Aufgrund der ebenfalls obengenannten Gründe, versuchs erstmal mit grid:
probier mal die folgenden Möglichkeiten mit verschiedenen Bildern aus(alle Bilder gleichzeitig, sonst rückt wieder alles zusammen und du siehst nix):

Code: Alles auswählen

 # *) deinBildCanvas oder deinBildLabel für xy einsetzen:
xy.grid(row=0, column=1)
xy.grid(row=0, column=0)
xy.grid(row=1, column=0)
xy.grid(row=1, column=1)
so, ich hoffe das hilft dir

Gruß, jj

Verfasst: Mittwoch 23. Mai 2007, 07:24
von Raio
Vielen Dank, nun funktioniert es auch bei mir. :wink: