Seite 1 von 1

Canvas scrollen klappt nicht

Verfasst: Montag 27. Oktober 2008, 13:07
von The Spirit
HI.
Habe ein Canvas in dem buttons, entryfelder und texte mittels grid positioniert werden.
Jetzt will ich dieses Canvas scrollbar machen, da es für den monitor zu groß ist.
Hier der Code für das canvas und die scrollbar

Code: Alles auswählen

#[Anfang] fenster generieren
hf=Tk()
hf.geometry('700x300')
hf.title('Auswertung')

scrollbar = Scrollbar(hf)
scrollbar.pack(side = RIGHT, fill = Y)

canvas = Canvas(hf, width=1000,height=300, scrollregion=(0, 0, 1000, 1000), yscrollcommand=scrollbar.set)
canvas.pack(side = LEFT, fill = Y)

scrollbar.config(command=canvas.yview)
#[Ende] fenster generieren
Jetzt kann ich zwar den Slider in der Scrollbar bewegen, der Inhalt des Canvas bleibt aber an seiner Stelle.
Wo hab ich hier den Denkfehler?
Thx

Verfasst: Montag 27. Oktober 2008, 14:25
von wuf
Hallo The Spirit

Und es bewegt sich doch.
Kannst du das folgende einmal ausprobieren:

Code: Alles auswählen

# Skriptname canvas_scroll_01.py (wuf)
import Tkinter as tk

#[Anfang] fenster generieren
hf=tk.Tk()
hf.geometry('700x300')
hf.title('Auswertung')

scrollbar = tk.Scrollbar(hf)
scrollbar.pack(side = tk.RIGHT, fill = tk.Y)

canvas = tk.Canvas(hf, width=1000,height=300, scrollregion=(0, 0, 1000, 1000), yscrollcommand=scrollbar.set)
canvas.pack(side = tk.LEFT, fill = tk.Y)

graphic_object = canvas.create_rectangle(10, 10, 100, 100)

button_1 = tk.Button(hf, text='Button-1')
button_1.place(x=150, y=10)

button_2 = tk.Button(None, text='Button-2')
button_2.place()

#~~ Grafik-Behaelter fuer normale Tk-Widgets
#   'Button_2' wird in diesen Behaelter gepackt
button_container = canvas.create_window(150, 80, anchor='nw', window=button_2)

scrollbar.config(command=canvas.yview)

hf.mainloop()
#[Ende] fenster generieren
Gruss wuf :wink:

Verfasst: Montag 27. Oktober 2008, 15:01
von yipyip
Bin mal wieder langsamer als wuf,
aber da ich das vorher auch noch nicht kannte:

http://paste.pocoo.org/show/89183/
(Prinzipiell das Gleiche wie wuf's Loesung)

:wink:
yipyip

Verfasst: Montag 27. Oktober 2008, 16:15
von The Spirit
fettes merci an alle.
hab noch a bissl was umgebaut, aber jetzt geht´s.
wenn ich das richtig sehe, kann ich das canvas object selbst nicht direkt scrollen, sonder muss es in einen container verpacken, der dann scrollbar ist.
oder?

Verfasst: Montag 27. Oktober 2008, 18:55
von wuf
Hallo The Spirit

Um keine Verwirrung zu stiften:

Tkinker-Widgets:
Frame,
Canvas,
Button
usw.

Canvas-Objekte:
Werden erzeugt mit den Tkinter Canvas-Widget zugehörigen Methoden:
create_rectangle,
create_line,
create_oval,
create_text,
create_window
usw.

Canvas-Objekte die du auf einer scrollbaren Canvas platziert hast verschieben sich beim betätigen der Scrollbar.

Tkinter Widgets, welche du direkt auf der scrollbaren Canvas platzierst verschieben sich nicht beim betätigen der Scrollbar.

Möchtest du auf der scrollbaren Canvas platzier Tkinter-Widgets mit der Scrollbar verschieben musst du diese in ein Canvas-Window-Objekt einbetten.

Hier nochmals das leicht abgeänderte Code-Snippet mit:

a) Die Objekte 'Button-1' und 'Canvas-1' sind direkt auf der scrollbaren Canvas platziert und verschieben sich nicht mit dem betätigen der Scrollbar.

b) Die Objekte 'Button-2' und 'Canvas-2' sind in ein Canvas-Window-Objekt eingebettet und verschieben sich beim betätigen der Scrollbar.

Code: Alles auswählen

# Skriptname canvas_scroll_01_02.py (wuf)
import Tkinter as tk

#[Anfang] fenster generieren
hf=tk.Tk()
hf.geometry('700x300')
hf.title('Auswertung')

scrollbar = tk.Scrollbar(hf)
scrollbar.pack(side = tk.RIGHT, fill = tk.Y)

canvas = tk.Canvas(hf, width=1000,height=300, scrollregion=(0, 0, 1000, 1000), yscrollcommand=scrollbar.set)
canvas.pack(side = tk.LEFT, fill = tk.Y)

graphic_object = canvas.create_rectangle(10, 10, 100, 100)

button_1 = tk.Button(canvas, text='Button-1')
button_1.place(x=150, y=10)

button_2 = tk.Button(None, text='Button-2')
button_2.place()

#~~ Grafik-Behaelter fuer 'button_2'
button_container = canvas.create_window(250, 10, anchor='nw', window=button_2)

canvas_1 = tk.Canvas(canvas, bg='green', width=80, height=20)
canvas_1.place(x=150, y=80)
canvas_1.create_text(5, 3, text='Canvas-1', anchor='nw')

canvas_2 = tk.Canvas(None, bg='green', width=80, height=20)
canvas_2.pack()
canvas_2.create_text(5, 3, text='Canvas-2', anchor='nw')

#~~ Grafik-Behaelter fuer 'canvas_2'
canvas_container = canvas.create_window(250, 80, anchor='nw', window=canvas_2)

scrollbar.config(command=canvas.yview)

hf.mainloop()
#[Ende] fenster generieren
Gruss wuf :wink:

Verfasst: Mittwoch 29. Oktober 2008, 16:31
von The Spirit
viele vielen dank für die genaue erklärung.
hast du für mich vielleicht noch nen weiterführenden link hierzu?
ich sag schonmal dankeschön

Verfasst: Mittwoch 29. Oktober 2008, 17:14
von wuf
Hallo The Spirit

http://effbot.org/tkinterbook/canvas.htm

Und einschlägige Snippets (evt. hier im Forum bzw. Web) analysieren.

Gruss wuf :wink: