Canvas Scrollregion Merkwürdigkeit

Fragen zu Tkinter.
Antworten
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

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
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Auch wenn es nicht hilft: Ich kann es reproduzieren. :cry:
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Schön, nicht allein auf der Welt zu sein. :)
Danke!
(...aber merkwürdig ist es doch?...)
:wink:
yipyip
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

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
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

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
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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:
Take it easy Mates!
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

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
Antworten