Класс Tkinter resizablecanvas не изменяет размеры всех виджетов и работает со сбоями.Холст продолжает расти - PullRequest
0 голосов
/ 30 января 2019

Tkinter resizablecanvas класс не изменяет размеры всех виджетов и работает со сбоями.Холст продолжает расти.Холст продолжает расти в размерах.Я пытаюсь добиться того, чтобы мне нужно было изменить размеры всех виджетов, когда я максимизирую окно.Мой код выглядит следующим образом:

from tkinter import *
from tkinter import ttk

class ResizingCanvas(Canvas):
    def __init__(self,parent,**kwargs):
        Canvas.__init__(self,parent,**kwargs)
        self.bind("<Configure>", self.resize)
        self.height = self.winfo_reqheight()
        self.width = self.winfo_reqwidth()

    def resize(self,event):
        wscale = float(event.width)/self.width
        hscale = float(event.height)/self.height
        self.width = event.width
        self.height = event.height
        self.config(width=self.width, height=self.height)
        self.scale("all",0,0,wscale,hscale)
        print (self.width, self.height)


class Test(Frame):
    def Widgets(self):
        self.tabcontrol = ttk.Notebook(self)

        self.mainframe = Frame(self)
        self.tabcontrol.add(self.mainframe, text = "TAB-1")
        self.tabcontrol.pack(fill= "both", expand = YES)

        self.canvasframe = Frame(self.mainframe)
        self.canvasframe.grid(row=0, column = 0)

        self.canvas = ResizingCanvas(self.canvasframe)
        self.canvas.grid(row=0, column = 0)

        self.widgetframe = Frame(self.canvasframe)
        self.canvas.create_window(100,100, window = self.widgetframe)

        self.LABEL = Label(self.widgetframe, text = "LABEL-1")
        self.LABEL.grid(row=1, column= 1)

        self.BUTTON = Button(self.widgetframe, text = "BUTTON-1")
        self.BUTTON.grid(row=1, column= 2)

        self.widgetframe.update_idletasks()


    def __init__(self,initial):
        super(Test, self).__init__(initial)
        self.grid()
        self.Widgets()


root = Tk()
Software = Test(root)
root.mainloop()

Может кто-нибудь помочь мне?Спасибо!

1 Ответ

0 голосов
/ 31 января 2019

Если я понимаю ваши требования, вы хотите, чтобы холст заполнил окно, даже когда размер окна изменяется.Tkinter может сделать это автоматически, если вы используете правильные опции grid, pack или place.

Вы сделали это очень затруднительным, выбрав несколько слоев кадров, ииспользуйте grid вместо pack.Если вы помещаете только один виджет в другой (элемент управления вкладками в корневом окне, холст в рамке холста и т. Д.), Для использования pack вместо grid потребуется меньше строк кода.

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

Обратите внимание на использование pack вместо grid при добавлении self в корневое окно и при добавлении холста в рамку.Вы можете использовать grid, если хотите, но для этого также необходимо настроить строки и столбцы, чтобы они имели ненулевой вес.Это легко сделать, но для такой простой схемы требуется три строки кода для grid и одна строка для pack.

from tkinter import *
from tkinter import ttk

class Test(Frame):
    def Widgets(self):
        self.tabcontrol = ttk.Notebook(self)

        self.mainframe = Frame(self)
        self.tabcontrol.add(self.mainframe, text = "TAB-1")
        self.tabcontrol.pack(fill= "both", expand = YES)

        self.canvas = Canvas(self.mainframe, background="bisque")
        self.canvas.pack(fill="both", expand=True)

        self.widgetframe = Frame(self.canvas)
        self.canvas.create_window(100,100, window = self.widgetframe)

        self.LABEL = Label(self.widgetframe, text = "LABEL-1")
        self.LABEL.grid(row=1, column= 1)

        self.BUTTON = Button(self.widgetframe, text = "BUTTON-1")
        self.BUTTON.grid(row=1, column= 2)        

    def __init__(self,initial):
        super(Test, self).__init__(initial)
        self.pack(fill="both", expand=True)
        self.Widgets()


root = Tk()
Software = Test(root)
root.mainloop()
...