Почему мои виджеты tkinter не растягиваются с использованием липкого веса и веса столбца / строки - PullRequest
1 голос
/ 04 апреля 2020

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

enter image description here

Заранее спасибо! Вот мой код:

    # Gui 
import tkinter as tk
from tkinter import N,W,S,E
from tkinter import messagebox
class Application(tk.Frame):

    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.grid(sticky = N+E+S+W)
        self.create_application_foundation()

    def create_application_foundation(self):
        # Create menubar ribbon

        self.topRibbon = tk.Frame(self, bg = "#E3E5E6")
        self.topRibbon.grid(row=0, column=0, sticky=W+E+N+S)


        # Initialize Buttons
        width = 15; height = 2; bg = "#F5F6F7"; relief = "flat"; bd = 0; padx = 1
        self.designViewerButton = tk.Button(self.topRibbon, text = "Design\nViewer", width = width,
                                         height = height, bg = bg, relief = relief, bd = bd)
        self.patternCreatorButton = tk.Button(self.topRibbon, text = "Pattern\nCreator",width = width,
                                                height = height, bg = bg, relief = relief, bd = bd)

        # Add buttons to ribbon
        self.designViewerButton.grid(row = 1, column = 0, padx = padx, sticky = N+W)
        self.patternCreatorButton.grid(row = 1, column = 1, padx = padx, sticky = N+W)

        # Create design viewer window
        self.createdesignViewerWindow()
        self.createObjectCreator()

        # Try to make things expandable
        self.topRibbon.grid_rowconfigure(1, weight=1)
        self.topRibbon.grid_columnconfigure(1, weight=1)

    def createdesignViewerWindow(self):
        width = 30; height = 1; bg = "#F5F6F7"; relief = "flat"; bd = 0; pady = 1

        # Create window
        self.designViewerWindow = tk.Frame(self, bg = "#E3E5E6")
        self.designViewerWindow.grid(row=1, column=0, sticky =W+E+N+S)

        # Create object button
        self.objectButton = tk.Button(self.designViewerWindow, text = "Object", width = width,
                                            height = height, bg = bg, relief = relief, bd = bd)
        self.objectButton.grid(row = 0, sticky =N+W, pady = pady)

        # Create object listbox
        self.objectListBox = tk.Listbox(self.designViewerWindow)        
        objects = ["Object {}".format(i) for i in range(50)]
        self.objectListBoxFrame = tk.Frame(self.designViewerWindow)
        self.objectsListBox = tk.Canvas(self.objectListBoxFrame, width=100, height=200)
        self.objectsListBox.grid(row = 0, rowspan = 5,column = 0, sticky = N+S)
        self.objectListBoxFrame.grid(row = 1, sticky = N+S, pady = pady)

        # Create canvas with blue rectangle
        self.imageCanvas = tk.Canvas(self.designViewerWindow, width=200, height=100)
        self.imageCanvas.grid(row = 0, rowspan = 5,column = 1, columnspan = 5, sticky = N+E+S+W)
        self.imageCanvas.create_rectangle(50, 25, 150, 75, fill="blue")
        self.imageCanvas.config(bg = "white")

        # Attempt to make window expandable        
        self.designViewerWindow.rowconfigure(1,weight = 1)
        self.designViewerWindow.columnconfigure(1, weight=1)

    def createObjectCreator(self):
        self.objectCreatorWindow = tk.Frame(self,bg = "#E3E5E6")
        self.tempLabel = tk.Label(self.objectCreatorWindow, text = "Object Creator").grid()

if __name__ == "__main__":
    import sys
    root = tk.Tk()
    root.title("My Program")
    root.grid_rowconfigure(1, weight=1)
    root.grid_columnconfigure(1, weight=1)

    # root.minsize(400,200)
    app = Application(master=root)
    app.mainloop()

1 Ответ

1 голос
/ 04 апреля 2020

Первая часть проблемы заключается в том, что вы не настроили приложение для заполнения окна, поэтому что-либо внутри приложения не заполнит окно.

Вы, похоже, пытаетесь это сделать, но вы указываете весь вес в окне root на строку и столбец 1, но вы помещаете app в строку и столбец 0. Вам нужно чтобы задать вес для строки и столбца 0:

root.grid_rowconfigure(0, weight=1)
root.grid_columnconfigure(0, weight=1)

Примечание: если у вас есть только один виджет в контейнере, проще использовать pack, так как вы можете настроить его так, чтобы заполнить окно только одной строкой код, а не три.

Например:

self.pack(fill="both", expand=True)

... против

self.grid(sticky = N+E+S+W)
root.grid_rowconfigure(1, weight=1)
root.grid_columnconfigure(0, weight=1)

Следующая проблема заключается в том, что вы помещаете виджеты в кадр Application с grid, но вы не указали вес ни одной строки или столбца в кадре Application. Итак, еще раз, этот фрейм не будет заполнять своего родителя, поэтому любой виджет внутри не будет заполнять окно тоже.

Я думаю, вы хотите, чтобы столбец 0 получил все дополнительное пространство, но вы хотите, чтобы строка 1 быть строкой, которая получает дополнительный пробел, поскольку именно там self.designViewerWindow.

Добавьте следующее к __init__ из Application:

class Application(tk.Frame):
    def __init__(self, master=None):
        ...
        self.grid_rowconfigure(1, weight=1)
        self.grid_columnconfigure(0, weight=1)
        ...

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

Все это будет немного легче увидеть, если вы сгруппировали все вызовы на grid для детей одного и того же виджета, а затем добавили команды rowconfigure и columnconfigure в том же месте. Таким образом, вы можете сразу увидеть все параметры сетки для каждой группы.

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