Seite 1 von 1

Canvas Scrollregion Merkwürdigkeit

Verfasst: Dienstag 2. Juni 2009, 15:15
von yipyip
Im Moment bin ich mit meinen archäologischen
Fähigkeiten am Ende und drehe mich im Kreis...

Im Prinzip geht es nur darum, ein grösseres
Canvas-Objekt vertikal zu scrollen.
Dies funktioniert auch einwandfrei mit
einer Spalte aus 'create_text()'-Objekten:
http://paste.pocoo.org/show/120564/

Verwende ich in meinem Canvas jedoch ein
Frame mit Entry-Widgets und
die 'create_window()'-Methode, so kann ich nur
bis zum Entry-Widget Nr.1516 scrollen.
Ab Widget Nr.2979 scheint in irgendeiner Form
ein Überlauf stattzufinden.

Liegts an mir oder am Tkinter?

Schon mal vielen Dank an diejenigen, die sich die Mühe machen,
hiermit zu experimentieren:
http://paste.pocoo.org/show/120565/

:wink:
yipyip

Verfasst: Dienstag 2. Juni 2009, 18:24
von numerix
Auch wenn es nicht hilft: Ich kann es reproduzieren. :cry:

Verfasst: Dienstag 2. Juni 2009, 18:29
von yipyip
Schön, nicht allein auf der Welt zu sein. :)
Danke!
(...aber merkwürdig ist es doch?...)
:wink:
yipyip

Verfasst: Dienstag 2. Juni 2009, 18:33
von kaytec
Hallo yipyip !

Habe auch mal gespielt - Bei Änderung der Widgethöhe andern sich auch die Anzahl der Entrys ? - wird dir auch nicht weiterhelfen.

Gruß Frank

Verfasst: Dienstag 2. Juni 2009, 18:44
von yipyip
Die Anzahl der Entry-Widgets übergebe ich
explizit mit 'ROWS'.
Mit

Code: Alles auswählen

self.canvas.update_idletasks()
self.canvas.config(scrollregion=self.canvas.bbox(tk.ALL))  
erfasse ich zum Schluss alle Entry-Widgets für die
Scrollregion.
Nur wenn es aus irgendeinem Grund zuviele sind
funktioniert es nicht richtig.

Nehme ich ein Canvas und 'create_text()', dann
kann das Canvas auch noch viel grösser sein und es funktioniert.
(siehe 1. Snippet)

:cry:
yipyip

Verfasst: Mittwoch 3. Juni 2009, 06:28
von wuf
Hallo yipyip

Stellte mit deinem Skript die genau gleichen Probleme fest. Es sieht fast so aus als ob der Tcl. Layout-Manager mit dieser Menge von Widget-Plazierungen überfordert ist. Habe nicht herausgefunden was der Tcl-Error: *_tkinter.TclError: Row out of bounds* genau bedeuten soll. Ich versuchte einmal jedes Eingabe-Widget in ein eigenes Canvas-Window-Objekt zu packen und so auf der Canvas zu platzieren. Und siehe da, dies scheint keine Probleme mehr zu machen. Hier das modifizierte Skript:
http://paste.pocoo.org/show/120722/

Enjoy programming with Tkinter!

Gruss wuf :wink:

Verfasst: Mittwoch 3. Juni 2009, 18:13
von yipyip
Hallo wuf,
Genial! Danke!

Anscheinend hängt es von der Gesamtgrösse
aller Widgets ab, die vom Layout-Manager zu
zu handhaben ist. Hier unterscheiden sich
pack() und grid() nicht unerheblich.

Bei

Code: Alles auswählen

import Tkinter as tk

ROWS = 1000
PADY = 23 # Experimentierwert, fuer PADY < 24 alles ok
root = tk.Tk()

for y in xrange(ROWS):
  en = tk.Label(root, text='%s' %  y, pady=PADY)
  en.grid(row=y, column=0)
  #en.pack(pady=PADY)
root.mainloop()
wird für PADY >= 24 wird die Ausgabe irgendwie 'gewrapped'.

Der 'out of bounds' Error stellt sich bei row =10000
oder column=10000 ein, ich vermute mal aufgrund dieser
krummen Zahl (keine 2er-Potenz), dass
hier explizit ein Selbstschutz für Tcl/Tk programmiert wurde.

:wink:
yipyip