Как вы размер динамического кадра tkinter - PullRequest
0 голосов
/ 28 апреля 2018

У меня есть рамка, которую я хочу использовать в качестве бокового меню навигации. Я хочу, чтобы меню можно было изменять с помощью мыши. У меня есть код, который изменяет размеры фрейма, но он не изменяет размер, пока вы не измените размер окна верхнего уровня. Я знаю о PanedWindows, и это не будет работать для меня.

from tkinter import *


def dragbar_on_click(event):
    event.widget.mouse_x = event.x


def dragbar_on_release(event):
    event.widget.mouse_x = 0


def dragbar_on_motion(event):
    if event.widget.mouse_x != 0:
        width = event.widget.parent.winfo_width() + event.x - event.widget.mouse_x

        event.widget.parent.config(width=width)


class DragBar(Frame):
    def __init__(self, parent, *args, **kwargs):
        super().__init__(parent, *args, **kwargs)
        self.parent = parent


class SideMenu(Frame):
    def __init__(self, parent, *args, **kwargs):
        super().__init__(parent, *args, **kwargs)

        self.config(bg='red', width=300)
        self.rowconfigure(0, weight=1)
        self.grid(sticky='NSEW')
        self.grid_propagate(0)

        self.frame = Frame(self, bg='purple')
        self.columnconfigure(0, weight=1)
        self.frame.grid(row=0, column=0, sticky='NSEW')

        self.dragbar = DragBar(self, bg='green', width=10)
        self.dragbar.mouse_x = 0
        self.dragbar.grid(row=0, column=1, sticky='NSW')

        self.dragbar.bind("<Motion>", dragbar_on_motion)
        self.dragbar.bind("<Button-1>", dragbar_on_click)
        self.dragbar.bind("<ButtonRelease-1>", dragbar_on_release)


root = Tk()
root.rowconfigure(0, weight=1)
root.columnconfigure(1, weight=1)

f = SideMenu(root)
Label(f.frame, text='This is a test line.').grid(sticky='NW')

root.mainloop()

1 Ответ

0 голосов
/ 28 апреля 2018

Я не уверен на 100%, есть ли лучший способ, но похоже, что ползунок обновляется при возникновении события "<Configure>".

Итак, вот быстрый хакерский способ сделать это.

В вашей функции dragbar_on_motion добавьте эти строки:

x = root.winfo_width()
y = root.winfo_height()
root.geometry("{}x{}".format(x, y))

Это вызовет событие "<Configure>" и обновит ползунок.

Вот ваш код изменен:

from tkinter import *


def dragbar_on_click(event):
    event.widget.mouse_x = event.x


def dragbar_on_release(event):
    event.widget.mouse_x = 0

def dragbar_on_motion(event):
    if event.widget.mouse_x != 0:
        width = event.widget.parent.winfo_width() + event.x - event.widget.mouse_x
        event.widget.parent.config(width=width)
        x = root.winfo_width()
        y = root.winfo_height()
        root.geometry("{}x{}".format(x, y))

class DragBar(Frame):
    def __init__(self, parent, *args, **kwargs):
        super().__init__(parent, *args, **kwargs)
        self.parent = parent


class SideMenu(Frame):
    def __init__(self, parent, *args, **kwargs):
        super().__init__(parent, *args, **kwargs)

        self.config(bg='red', width=300)
        self.rowconfigure(0, weight=1)
        self.grid(sticky='NSEW')
        self.grid_propagate(0)

        self.frame = Frame(self, bg='purple')
        self.columnconfigure(0, weight=1)
        self.frame.grid(row=0, column=0, sticky='NSEW')

        self.dragbar = DragBar(self, bg='green', width=10)
        self.dragbar.mouse_x = 0
        self.dragbar.grid(row=0, column=1, sticky='NSW')

        self.dragbar.bind("<Motion>", dragbar_on_motion)
        self.dragbar.bind("<Button-1>", dragbar_on_click)
        self.dragbar.bind("<ButtonRelease-1>", dragbar_on_release)


root = Tk()
root.rowconfigure(0, weight=1)
root.columnconfigure(1, weight=1)

f = SideMenu(root)
Label(f.frame, text='This is a test line.').grid(sticky='NW')

root.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...