Форум сайта python.su
Добрый день!
Столкнулся со следующей проблемой… Рисую Canvas и Scrollbar к нему. В Canvas у меня располагается меню Checkbutton.
Задача заключается в том, чтобы при возростании пунктов меню Checkbutton, можно было прокручивать Canvas. Но, почему-то, Scrollbar:
1) остается неактивным (при использовании “bbox”),
2) стает активен, но его прокрутка не производит никаких видимых действий, при фиксированном задании значений для scrollregion
Подскажите, пожалуйста, что я делаю не так? Благодарю.
Код прилагается:
from tkinter import * from tkinter.ttk import * import os root = Tk() directory = os.getcwd() menuDirectory = directory + '\\menu\\' files = sorted(os.listdir(menuDirectory)) f0 = open(menuDirectory + files[0], 'r') app0 = f0.readlines() f0.close() root.title('Program') root.minsize(width=750,height=300) root.maxsize(width=750,height=300) root['borderwidth'] = 15 canvas0 = Canvas(root,width=400,heigh=1600) canvas0['highlightthickness'] = 0 canvas0.pack(side=LEFT,fill=BOTH,expand=True) canvas0.pack_propagate(False) canvas0.configure(scrollregion=canvas0.bbox("all")) scroll0 = Scrollbar(root,orient=VERTICAL) scroll0.config(command=canvas0.yview) canvas0.configure(yscrollcommand=scroll0.set) scroll0.pack(side=RIGHT,fill=Y) i=1 u=2 root.vars={} for q in app0: x0 = q.split('*')[0] root.var=BooleanVar() ch0 = Checkbutton(canvas0,text=x0,variable=root.var,onvalue=True,offvalue=False) ch0.grid(row=u,column=i,ipadx=20,padx=5,pady=10,sticky='nsew') ch0.grid_propagate(False) if i<4: i+=1 else: u+=1 i=1 root.var.set(False) root.vars[q] = root.var root.mainloop()
Отредактировано Submersed (Март 10, 2016 12:38:19)
Офлайн
Прошу прощения за offtop, просто хочу понять: а почему был выбран Canvas? Я для аналогичной задачи выбрал Text, правда, огрёб совершенно неожиданные грабли. Но, может быть, вам больше повезёт?
А по теме - возможно, у вас проблема в том, что у вас нет корректного соотношения координат окна с координатами области прокрутки. Вот тут есть некоторые объяснения:
The scrollregion option is used to limit scrolling operations for the canvas. To set this, you can usually use something like:
canvas.config(scrollregion=canvas.bbox(ALL))
To convert from window coordinates to canvas coordinates, use the canvasx and canvasy methods:
def callback(event):
canvas = event.widget
x = canvas.canvasx(event.x)
y = canvas.canvasy(event.y)
print canvas.find_closest(x, y)
Офлайн
Запостил уже в другом вопросе. Продублирую. Пример для 2.7. Для 3.Х нужно поменять Tkinter на tkinter
import Tkinter # def reconf_canvas(event): canv.configure(scrollregion=canv.bbox('all')) # root = Tkinter.Tk() root.geometry("400x400+100+100") # canv = Tkinter.Canvas(root, width=200, height=200) canv.grid(row=0, column=0) # frm = Tkinter.Frame(canv) frm.pack() # scr = Tkinter.Scrollbar(root) scr.grid(row=0, column=1, sticky="ns") scr["command"] = canv.yview canv["yscrollcommand"] = scr.set canv.create_window((0,0), window=frm, anchor="nw") frm.bind("<Configure>", reconf_canvas) # for i in xrange(20): but = Tkinter.Button(frm, text=u"Кнопка %01d" % i) but.pack() # root.mainloop()
Офлайн
4kpt_IVОгромное спасибо. Все заработало.
Запостил уже в другом вопросе. Продублирую. Пример для 2.7. Для 3.Х нужно поменять Tkinter на tkinter
Офлайн
Какая ось?
Офлайн
4kpt_IVWindows (7, 8, 10)
Какая ось?
Офлайн
Событие MouseWhell
Офлайн