Canvas: yscrollcommand

Fragen zu Tkinter.
Antworten
Benutzeravatar
Hannes-Spz
User
Beiträge: 123
Registriert: Sonntag 7. August 2005, 22:42

hi leutz, ....
ich komme hier einfach nicht mehr weiter,
kann mal bitte, bitte jemand 5 min seiner sicherlich kostbaren zeit dazu opfern,
mir zu sagen, wie man mittels einer scrollbar und einem canvas immer in diesem
canvas hoch und herunterscrollen kann??
bei mir schreibe ich mittels canvas.create_text() etwas in das Canvas-Feld, was aber dann überlänge bekommt, aber das Canvas sich trotz
.pack(expand = 1)
nicht erweitert...
[size=85]"Unsere Situation ist immer die eines schwarzen Mannes der in einem schwarzen Keller einen schwarzen Hut sucht, den es vielleicht gar nicht gibt." Sir Karl R. Popper[/size]
jAN
User
Beiträge: 170
Registriert: Samstag 4. Juni 2005, 18:51
Wohnort: Großmehlra (in Thüringen)
Kontaktdaten:

Hi Hannes!
Damit müsste es funktionieren...

Code: Alles auswählen

from Tkinter import *
root=Tk()
yscrollbar=Scrollbar(root,orient=VERTICAL)
can=Canvas(root,yscrollcommand=yscrollbar.set)
yscrollbar.pack(side=RIGHT,fill=Y)
can.pack(side=LEFT,fill=BOTH,expand=1)
yscrollbar.config(command=can.yview)
root.mainloop()
ich hab es nicht richtig ausprobiert... jedenfalls gibt es rechts ne scrollbar
musst du selbst ausprobieren

mfg JAN
#adios.py
import os,sys
while 1: os.startfile(sys.argv[0])
Benutzeravatar
Hannes-Spz
User
Beiträge: 123
Registriert: Sonntag 7. August 2005, 22:42

danke erstmal, aber das hatte ich auch schon probiert...

die sache kommt genau dann ins stocken, wenn man das script folgendermaßen
erweitert/verändert:

Code: Alles auswählen

from Tkinter import * 
root=Tk() 
yscrollbar=Scrollbar(root,orient=VERTICAL) 
can=Canvas(root,yscrollcommand=yscrollbar.set) 
yscrollbar.pack(side=RIGHT,fill=Y) 
can.pack(side=LEFT,fill=BOTH,expand=1) 
yscrollbar.config(command=can.yview) 
####
for i in range(20):
    can.create_text(20, 15*i, text = str(i))
####
root.mainloop()
die scrollbar zeigt er mir zwar an, aber sie glaubt warscheinlich, dass can nicht
gefüllt ist... ?!
[size=85]"Unsere Situation ist immer die eines schwarzen Mannes der in einem schwarzen Keller einen schwarzen Hut sucht, den es vielleicht gar nicht gibt." Sir Karl R. Popper[/size]
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

Hast du schon:
http://www.python-forum.de/post-32841.html#32841
gelesen?

Brauchst du wirklich ein Canvas wenn du Text reinschreiben willst?

cu Sebastian
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

Hannes-Spz hat geschrieben:...
kann mal bitte, bitte jemand 5 min seiner sicherlich kostbaren zeit dazu opfern,
mir zu sagen, wie man mittels einer scrollbar und einem canvas immer in diesem
canvas hoch und herunterscrollen kann??
bei mir schreibe ich mittels canvas.create_text() etwas in das Canvas-Feld, was aber dann überlänge bekommt, aber das Canvas sich trotz
.pack(expand = 1)
nicht erweitert...

Hallo Hannes,

bekommst gern meine Zeit! Expand bringt Dir nur etwas, wenn sich die Größe des Canvas Widgets ändert, nicht die seiner Inhalte. Aber die Lösung ist beeindruckend einfach und heißt: scrollregion :idea:

Ich habe Dir mal eine kurze Demo mit zwei Scrollbalken zusammengezimmert. Dabei habe ich aber den grid-Geometriemanager benutzt, ich finde den irgendwie übersichtlicher. Hier der Code:

Code: Alles auswählen

import Tkinter as TK
import Canvas

tk = TK.Tk()
yscroll = TK.Scrollbar(tk, orient = TK.VERTICAL)
yscroll.grid(row = 1, column = 2, sticky = TK.NS)

xscroll = TK.Scrollbar(tk, orient = TK.HORIZONTAL)
xscroll.grid(row = 2, column = 1, sticky = TK.EW)

canvas = TK.Canvas(tk,
                   width = 200,
                   height = 200,                        
                   scrollregion = "0 0 400 400",        ##  Scrollregion im Bereich 0,0 - 400, 400
                   yscrollcommand = yscroll.set,        ##  Canvashoehe an yscroll uebergeben
                   xscrollcommand = xscroll.set)        ##  Canvasbreite an xscroll uebergeben
canvas.grid(row = 1, column = 1)

rect = Canvas.Rectangle(canvas, (40, 40), (280, 380), fill="#9999ff")   ##  um was zu sehen

yscroll.config(command = canvas.yview)                  ##  yscrollwerte an canvas uebergeben
xscroll.config(command = canvas.xview)                  ##  xscrollwerte an canvas uebergeben

tk.mainloop()
Ist ganz einfach. Der Canvas ist eine ideale (unendliche) Fläche. Du brauchst nur festzulegen, welchen Ausschnitt Du sehen möchtest (in meinem Beispiel von 0,0 bis 400,400) und schon funzt das. :D

Ich hoffe das hilft Dir weiter.

Liebe Grüße,
der Michel
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Benutzeravatar
Hannes-Spz
User
Beiträge: 123
Registriert: Sonntag 7. August 2005, 22:42

Michael, du bist ein Gott!!
diese antwort von dir hat gleich 4 weitere "projekte" von mir vereinfacht...

tausend dank!! :D
[size=85]"Unsere Situation ist immer die eines schwarzen Mannes der in einem schwarzen Keller einen schwarzen Hut sucht, den es vielleicht gar nicht gibt." Sir Karl R. Popper[/size]
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

Hannes-Spz hat geschrieben:Michael, du bist ein Gott!!
Hi Hannes,

auch wenn diese Einstellung eine gute Basis für weitere Gespräche wäre, so muss ich Dir dennoch widersprechen. Ich habe diese option auch erst vor ca. 3 Wochen im genialen Einsteigerwerk "Das Python-Buch" im Abschnitt über Tkinter gelesen.

Grüße,
Michael
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Antworten