Canvas scrollen klappt nicht

Fragen zu Tkinter.
Antworten
The Spirit
User
Beiträge: 274
Registriert: Freitag 8. Juni 2007, 08:50
Wohnort: 84xxx Bereich
Kontaktdaten:

Montag 27. Oktober 2008, 13:07

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

Montag 27. Oktober 2008, 14:25

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

Montag 27. Oktober 2008, 15:01

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
The Spirit
User
Beiträge: 274
Registriert: Freitag 8. Juni 2007, 08:50
Wohnort: 84xxx Bereich
Kontaktdaten:

Montag 27. Oktober 2008, 16:15

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

Montag 27. Oktober 2008, 18:55

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:
Take it easy Mates!
The Spirit
User
Beiträge: 274
Registriert: Freitag 8. Juni 2007, 08:50
Wohnort: 84xxx Bereich
Kontaktdaten:

Mittwoch 29. Oktober 2008, 16:31

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

Mittwoch 29. Oktober 2008, 17:14

Hallo The Spirit

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

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

Gruss wuf :wink:
Take it easy Mates!
Antworten