Как установить максимальное ограничение для перетаскивания в tkinter PanedWindow?

#python #tkinter

Вопрос:

 import tkinter as tk
root = tk.Tk()
my_paned_window = tk.PanedWindow(master=root)
frame1 = tk.Frame(master=my_paned_window, bg='snow')
frame2 = tk.Frame(master=my_paned_window)
tk.Label(master=frame1, text='frame1').pack()
tk.Label(master=frame2, text='frame2').pack()
my_paned_window.add(frame1)
my_paned_window.add(frame2)
my_paned_window.pack(fill=tk.BOTH)
root.mainloop()
 

В приведенном выше коде я не хочу, чтобы фрейм1 слишком сильно расширялся при перетаскивании. Как я могу установить для этого ограничение?

Ответ №1:

Нет простых способов сделать это. Этого можно достичь либо установив значение minsize для параметра frame2.

Что-то вроде этого:

 ...
my_paned_window.add(frame1)
my_paned_window.add(frame2, minsize=550)
...
 

Другой способ заключается в том, чтобы return "break" , когда положение створки больше максимальной ширины, ее больше нельзя перемещать.

минимальный пример:

 import tkinter as tk

class PanedWindow(tk.PanedWindow):

    def __init__(self, *args, **kwargs):
        super(PanedWindow, self).__init__(*args, **kwargs)
        self.max_width = {}
        self.bind("<B1-Motion>", self.check_width)
        self.bind("<ButtonRelease-1>", self.set_width)

    def add(self, child, max_width=None, *args):
        super(PanedWindow, self).add(child, *args)
        self.max_width[child] = max_width

    def check_width(self, event):
        
        for widget, width in self.max_width.items():
            if width and widget.winfo_width() >= width:
                self.paneconfig(widget, width=width) 
                return "break"

    def set_width(self, event):
        for widget, width in self.max_width.items():
            if width and widget.winfo_width() >= width:
                self.paneconfig(widget, width=width-1) 
      

root = tk.Tk()
my_paned_window = PanedWindow(master=root, sashwidth=5)

max_width = 500

frame1 = tk.Frame(master=my_paned_window, bg='red')
frame2 = tk.Frame(master=my_paned_window, bg='blue')
frame3 = tk.Frame(master=my_paned_window, bg="green")

tk.Label(master=frame1, text='frame1').pack()
tk.Label(master=frame2, text='frame2').pack()

my_paned_window.add(frame1, max_width=500)
my_paned_window.add(frame2)
my_paned_window.pack(fill=tk.BOTH, expand=True)

root.mainloop()