Как выровнять виджеты в сетке с помощью tkinter? - PullRequest
0 голосов
/ 01 марта 2019

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

Я пропустил классы LoadedMachine и CreateMachine, потому что не чувствую, что они нужны.Если они будут полезны, я могу отредактировать вопрос, чтобы добавить их.

class App(tk.Tk):

    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        container = tk.Frame(self)
        container.pack(side='top', fill='both', expand=True)

        self.frames = {}

        for F in (StartPage, LoadedMachine, CreateMachine):
            page_name = F.__name__
            frame = F(parent=container, controller=self)
            self.frames[page_name] = frame
            frame.grid(row=0, column=0)
            frame.config(bg='white')

        self.show_frame('StartPage')

    def show_frame(self, page_name):
        frame = self.frames[page_name]
        frame.tkraise()


class StartPage(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        self.rowconfigure(0, weight=1)
        self.rowconfigure(1, weight=1)
        self.rowconfigure(2, weight=1)
        self.columnconfigure(0, weight=1)
        self.columnconfigure(1, weight=1)
        self.columnconfigure(2, weight=1)

        welcome_label = tk.Label(self, text='Welcome', bg='green', fg='white', font=('Verdana', 80))
        welcome_label.grid(row=0, column=1)

        loadButton = tk.Button(self, text='Load an existing state machine', command=lambda: controller.show_frame('LoadedMachine'))
        loadButton.config(highlightbackground='green', font=('Verdana', 18))
        loadButton.grid(row=1, column=1)

        createButton = tk.Button(self, text='Create a new state machine', command=lambda: controller.show_frame('CreateMachine'))
        createButton.config(highlightbackground='green', font=('Verdana', 18))
        createButton.grid(row=2, column=1)    


if __name__ == '__main__':
app = App()
app.title('Cognitive State Machine')
app.geometry('800x600')
app.mainloop()

Вот что я получаю:

enter image description here

Я хочу, чтобы кнопки были ближе друг к другу и ближе к ярлыку.

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Одно из предложений - сначала добавить несколько цветов фона при создании кадров для устранения неполадок.

class App(tk.Tk):

    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        container = tk.Frame(self,bg="yellow")
        container.pack(side='top', fill='both', expand=True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)
        ...

Когда вы запустите это, вы увидите кучу желтого цвета, что означает, что ваша рамка StartPage не заполняет пространство.Поэтому вам нужно изменить его:

for F in (StartPage,):
        page_name = F.__name__
        frame = F(parent=container, controller=self)
        self.frames[page_name] = frame
        frame.grid(row=0,column=0,sticky="nesw")
        frame.config(bg='green')

Теперь вы можете видеть, что ваш фон становится зеленым, что означает, что ваша рамка StartPage правильно масштабируется.Наконец, вы можете поработать над вашими ярлыками:

def __init__(self, parent, controller):
    tk.Frame.__init__(self, parent)
    self.controller = controller
    self.columnconfigure(0, weight=1)
    ...

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

0 голосов
/ 01 марта 2019

Добавьте заполнение к сетке, чтобы выровнять его так, как вы хотите

Вы можете добавить padx или pady в соответствии с вашими потребностями

loadButton.grid(row=1, column=1, padx=10, pady=20)

Полезная ссылка для дальнейшей игры с сеткой

Также вместо «лямбда» вы можете использовать «частичный», так как нам нужно вызвать функцию из командной функции и определить ее там.

...