Если все три окна изначально сделать скрытыми (state=HIDDEN, строка 41 и т.д.)и оставить их включение на волю юзера, то все работает, но если одно окно изначально не скрывать или снять коммент с вызова функции show1() , строка 80, то скролл работает так, будто scrollregion не задан, а bbox выводит координаты (0,0,1,1) т.е. все виджеты занимают 1 пиксель.
Почему оно так я не могу ни понять ни нагуглить.
ОС - Дебиан Ленни.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from Tkinter import *
app=Tk()
toolbar=Frame (app, relief=RIDGE)
field=Frame (app, relief=RIDGE)
canva=Canvas (field, width=1000, height=500, relief=SUNKEN)
sbar=Scrollbar(field, command=canva.yview, orient=VERTICAL, bg="gray", takefocus=0)
canva.configure(yscrollcommand=sbar.set)
def wheel (event): #привязка колеса мыши к "холсту"
if event.num == 5 or event.delta == -120:
canva.yview(SCROLL, 1, "units")
if event.num == 4 or event.delta == 120:
canva.yview(SCROLL, -1, "units")
app.bind ("<Button-4>",wheel)
app.bind ("<Button-5>",wheel)
app.bind ("MouseWheel", wheel)
canva.focus_set()
frame1=Frame(field)
frame2=Frame(field)
frame3=Frame(field)
list1=[]
list1=range(20)
for step in range (20):
list1[step]=Button (frame1, text="First "+str(step)+" of 20")
list1[step].pack (side=TOP)
list2=[]
list2=range(30)
for step in range(30):
list2[step]=Button (frame2, text="Second "+str(step)+" of 30")
list2[step].pack (side=TOP)
list3=[]
list3=range(40)
for step in range (40):
list3[step]=Button (frame3, text="Third "+str(step)+" of 40")
list3[step].pack (side=TOP)
window1=canva.create_window(0,0,window=frame1,anchor=NW)
canva.itemconfig (window1,state=HIDDEN)
window2=canva.create_window(0,0,window=frame2,anchor=NW)
canva.itemconfig (window2,state=HIDDEN)
window3=canva.create_window(0,0,window=frame3,anchor=NW)
canva.itemconfig (window3,state=HIDDEN)
field.pack(side=BOTTOM)
sbar.pack(side=RIGHT,fill=Y)
canva.pack(side=BOTTOM)
toolbar.pack(fill=X,side=TOP)
def show1(): #показать окно1, скрыть окна 2 и 3
canva.itemconfig (window1,state=NORMAL)
canva.itemconfig (window2,state=HIDDEN)
canva.itemconfig (window3,state=HIDDEN)
print canva.bbox(window1)
canva.configure(scrollregion=canva.bbox(window1))
def show2(): #показать окно2, скрыть окна 1 и 3
canva.itemconfig (window2,state=NORMAL)
canva.itemconfig (window1,state=HIDDEN)
canva.itemconfig (window3,state=HIDDEN)
print canva.bbox(window2)
canva.configure(scrollregion=canva.bbox(window2))
def show3(): #показать окно3, скрыть окна 2 и 1
canva.itemconfig (window3,state=NORMAL)
canva.itemconfig (window2,state=HIDDEN)
canva.itemconfig (window1,state=HIDDEN)
print canva.bbox(window3)
canva.configure(scrollregion=canva.bbox(window3))
but1=Button (toolbar, text="switch 1",command=show1)
but1.pack(side=LEFT)
but2=Button (toolbar, text="switch 2",command=show2)
but2.pack(side=LEFT)
but3=Button (toolbar, text="switch 3",command=show3)
but3.pack(side=LEFT)
def main():
#show1()
print "1 "+str(canva.bbox(window1))
print "2 "+str(canva.bbox(window2))
print "3 "+str(canva.bbox(window3))
app.mainloop()
return 0
if __name__ == '__main__': main()