Liste mit Bildern auf unterschiedliche Dialoge

Fragen zu Tkinter.
Antworten
dennbas
User
Beiträge: 25
Registriert: Mittwoch 28. September 2016, 10:20

Hallo zusammen,

ich habe eine Liste mit Bildern die ich jeweils auf einem Dialog platzieren will.
Also jedes Bild auf einem eigenen Dialog.

Das Ganze läuft in einer Schleife durch die Bildliste.

Nun ist das Problem, dass ich nur auf dem letzten Dialog ein Bild sehe.
Alle Dialoge davor haben kein Bild.

Zu dem Bild wird auf jedem Dialog auch noch Text ausgegeben, dieser erscheint ohne Problem.

Hat jemand eine Idee was ich falsch mache ?

Die Mainloop rufe ich am Ende der Schleife auf.


VG,
Dennis
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@dennbas: ohne Code wird das schwierig zu raten, was Du denn falsch machst.
dennbas
User
Beiträge: 25
Registriert: Mittwoch 28. September 2016, 10:20

Code: Alles auswählen


def make_label(master, x, y, w, h, img, *args, **kwargs):
    f = Frame(master, height = h, width = w)
    f.pack_propagate(0) 
    f.place(x = x, y = y)
    label = Label(f, image = img, *args, **kwargs)
    label.pack(fill = BOTH, expand = 1)
    return label
    
    
    
  AnzahlgleicheBilder = len(curPics)

  for i in range(0,AnzahlgleicheBilder):

      volleGroesseY = ((GetSystemMetrics(1) * 70)/100) - 40
      volleGroesseX = GetSystemMetrics(0)

      groesseY = volleGroesseY 
      groesseX = volleGroesseX / AnzahlgleicheBilder

      #Einschraenkung der Bildgroesse
      rechts30 = volleGroesseY - ((volleGroesseX * 30 ) /100)

      dialogfenster=Toplevel()

      DiaName = "Bild %i"%(i)
      dialogfenster.title(DiaName)
      #("170x200+30+30") "HxB+X+Y"
      if i == 0:
          reso = "%ix%i+%i+%i" % (groesseX,groesseY,0,0)
      if i == 1:
          reso = "%ix%i+%i+%i" % (groesseX,groesseY,groesseX,0)
      if i == 2:
          reso = "%ix%i+%i+%i" % (groesseX,groesseY,groesseX,groesseY/2)
      if i == 3:
          reso = "%ix%i+%i+%i" % (groesseX,groesseY,groesseX*2,groesseY/2)
      dialogfenster.geometry(reso)

      print curPics[i].filename
      aktBild = ImageTk.PhotoImage(curPics[i].resize( (groesseY , groesseX) ) )  # aktuelles Bild

      # (master, x, y, w, h, img, *args, **kwargs):
      make_label(dialogfenster, 0, 0, groesseX , groesseY ,aktBild)


  hauptfenster.mainloop()

__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du musst die after Methode verwenden. Wird hier permanent diskutiert, einfach mal in den Tkinter Themen der letzten Wochen stöbern.
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@__deets__: das ist mal ausnahmsweise nicht dieses Problem, sondern das andere.

@dennbas: man muß immer eine Referenz auf die Bilder speichern, weil sonst der Speicher dafür wieder freigegeben wird. Über den Index einer Liste zu iterieren, ist ein Anti-Pattern, statt dessen benutz man enumerate. Die Einrückunge sind kaputt. rechts30 wird nicht benutzt. Alles, was sich nicht innerhalb der for-Schleife ändet, solltest Du davor berechnen.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

@Sirius3: ups. Ich hab nur die for Schleife gesehen.... na gut. Danke!
dennbas
User
Beiträge: 25
Registriert: Mittwoch 28. September 2016, 10:20

ah super, habe schon verzweifelt versucht den Zusammenhang zwischen meinem Problem und after() zu finden.
Dass "rechts30" nicht genutzt wird liegt daran, dass ich versucht habe alle "unnötigen" Zeilen zwecks Übersicht rauszunehmen.

Mit dem Speichern der Referenzen hat es nun geklappt.

Vielen Dank für die Hilfe und die Tipps

VG,
Dennis
dennbas
User
Beiträge: 25
Registriert: Mittwoch 28. September 2016, 10:20

So leider habe ich noch ein weiteres Problem.

Auf jedem Dialog habe ich Dropdowns. Da die Dialoge in der For-Schleife laufen habe ich für jedes Dropdown die gleiche Variable.

Wie kann ich nun nachdem die Schleife durchgelaufen ist die Werte der einzelnen Dropdowns auslesen ?

Für jeden Dialog ne eigene Var geht ja auch nicht da es ja in der Schleife läuft ? Die Werte in der Schleife in einer Liste zu speichern geht auch nicht da die Werte ja erst beim Klick auf die Dropdowns gesetzt werden.

Code: Alles auswählen

tkGEB = StringVar(hauptfenster)
choicesGeb= [1,2,3,4,20]

for i,value in enumerate(curPics):

            popGEB = OptionMenu(dialogfenster, tkGEB, *choicesGeb)
            popGEB.place(x=PopX, y=Popy)

mit einem unschönen

Code: Alles auswählen

    global tkLAUF
    print str(tkLAUF.get())
bekomme ich immer den Wert des Dropdowns aus dem letzten Diealog, was irgendwie Sinn macht...
dennbas
User
Beiträge: 25
Registriert: Mittwoch 28. September 2016, 10:20

Konnte das Problem nun selbst lösen, war analog zu dem Bilderproblem.
Referenzen in ne Liste gepackt und darüber dann an die Werte gekommen.

Danke nochmal für die Hilfe.
Antworten