Bildskalierung

Fragen zu Tkinter.
Antworten
Raio
User
Beiträge: 4
Registriert: Dienstag 15. Mai 2007, 22:59

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.
Zizibee
User
Beiträge: 229
Registriert: Donnerstag 12. April 2007, 08:36

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!
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

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
Flano
User
Beiträge: 43
Registriert: Sonntag 5. September 2004, 14:13

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
Raio
User
Beiträge: 4
Registriert: Dienstag 15. Mai 2007, 22:59

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
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

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
Raio
User
Beiträge: 4
Registriert: Dienstag 15. Mai 2007, 22:59

Vielen Dank, nun funktioniert es auch bei mir. :wink:
Antworten