У меня появилась задачка: есть набор фреймов, организованных grid'ами в виде таблицы. Необходимо, чтобы они изменяли размер, когда пользователь их растягивает по горизонтали/вертикали с помощью мышки. Я искала подобный функционал в tkinter, не нашла, в результате сделала под свою задачку следующее:
Код рабочий, но хотелось бы узнать, можно подобрать более элегантное решение?
Как грамотно ресайзить фреймы с помощью мыши? Если в tkinter уже есть такой функционал, подскажите, пожалуйста, ссылку.
def AddResizer(self, obj, targetWin, side, minsize, col_row_num): ''' obj - фрейм, в который помещается полоска, за которую его растягиваем targetWin - ряд/колонка таблицы, которую растягиваем side - положение полоски (BOTTOM, TOP, LEFT, RIGHT) minsize - начальное значение минимальной ширины/высоты targetWin col_row_num - номер столбца/колонки ''' # если растягиваем ячейку/ряд по вертикали if side in (BOTTOM, TOP): resFrame = Frame(obj, background=self.CFG['resizer_color'], height=self.CFG['resizer_size']) resFrame.pack( side= side, fill="x") targetWin.rowconfigure(col_row_num, minsize=minsize) ishor = False else: # LEFT, RIGHT resFrame = Frame(obj, background=self.CFG['resizer_color'], width=self.CFG['resizer_size']) resFrame.pack( side = side, fill="y") targetWin.columnconfigure(col_row_num, minsize=minsize) ishor = True obj.xyminsize = minsize resFrame.bind('<ButtonPress-1>', lambda e, o=obj, i=ishor:self.StartMove(e, o, i)) resFrame.bind('<ButtonRelease-1>', lambda e, o=obj, i=ishor:self.StopMove(e, o, i)) resFrame.bind('<B1-Motion>', lambda e, o=obj, i=ishor, tw=targetWin:self.OnMotion(e, o, i, tw)) def StartMove(self, event, obj, ishor): obj.xyevent = event.x if ishor else event.y obj.xyroot = event.x_root if ishor else event.y_root def StopMove(self, event, obj, ishor): obj.xyevent = None obj.xyminsize += (event.x_root - obj.xyroot) if ishor else (event.y_root - obj.xyroot) def OnMotion(self,event, obj, ishor, targetWin): if ishor: targetWin.columnconfigure(0, minsize=(obj.xyminsize + event.x_root - obj.xyroot)) else: targetWin.rowconfigure(0, minsize=(obj.xyminsize + event.y_root - obj.xyroot))
Спасибо заранее!