Как мне отформатировать мой графический интерфейс с помощью tkinter с помощью .grid?

#python #python-3.x #tkinter

#python #python-3.x #tkinter

Вопрос:

Я пытаюсь использовать .grid для форматирования моего графического интерфейса, но он ничего не делает. Ниже приведен мой код и желаемый макет!

введите описание изображения здесь Вот код, который я использую. Я совсем новичок в Python…

Я не уверен в других методах форматирования, кроме .grid, поэтому любые другие варианты тоже были бы хороши!

 from tkinter import *

class PayrollSummary:
    def __init__(pay):
        window = Tk()
        window.title("Employee Payroll")

        #Add Frame 1
        frame1 = Frame(window)
        frame1.pack()

        #Add ReadFile Button
        btReadFile = Button(frame1, text = "Read File")
        btReadFile.pack()

        #Add ShowPayroll Button
        btShowPayroll = Button(frame1, text = "Show Payroll")
        btShowPayroll.pack()

        #Add FindEmployee by Name Button
        btFindEmployee = Button(frame1, text = "Find Employee by Name")
        btFindEmployee.pack()

        #Add Highest Radio Button
        rbHigh = Radiobutton(frame1, text = "Highest")
        rbHigh.pack()

        #Add Lowest Radio Button
        rbLow = Radiobutton(frame1, text ="Lowest")
        rbLow.pack()

        #Add FindEmployee by Amount Button
        btFindEmployee_A = Button(frame1, text = "Find Employee by Amount")
        btFindEmployee_A.pack()

        #Add WriteOutput Button
        btOutput = Button(frame1, text = "Write Output to File")
        btOutput.pack()

        #Add Cancel Button
        btCancel = Button(frame1, text = "Cancel")
        btCancel.pack()



        btReadFile.grid(row = 1, column = 2)
        btShowPayroll.grid(row = 2, column = 2)
        btFindEmployee.grid(row = 2, column = 4)
        rbHigh.grid(row = 3, column = 2)
        rbLow.grid(row = 3, column = 4)
        btFindEmployee_A.grid(row = 3, column = 6)
        btOutput.grid(row = 4, column = 2)
        btCancel.grid(row = 4, column = 4)



        window.mainloop()

PayrollSummary()
 

Комментарии:

1. используйте pack() или grid() , а не оба для одного и того же элемента (ов). Вы также можете использовать pack() для frame(s) вставки окон и grid() размещения виджетов внутри фреймов.

Ответ №1:

pack() , grid() и place() есть три способа поместить виджеты в window (или в другой виджет).
Если вы используете grid() с каким-либо виджетом, не используйте pack() или place() .

Документ о effbot.org : сетка, упаковка, место

Я удалил все .pack() , кроме frame.pack() и получил почти то, что вы ожидали.

введите описание изображения здесь

Теперь виджеты должны быть выровнены по левому краю ( 'west' ) с помощью sticky='w'

И после добавления второго Frame я получил

введите описание изображения здесь

Код:

 from tkinter import *

class PayrollSummary:
    def __init__(pay):
        window = Tk()
        window.title("Employee Payroll")

        #Add Frame 1
        frame1 = Frame(window)
        frame1.pack()

        #Add ReadFile Button
        btReadFile = Button(frame1, text = "Read File")

        #Add ShowPayroll Button
        btShowPayroll = Button(frame1, text = "Show Payroll")

        #Add FindEmployee by Name Button
        btFindEmployee = Button(frame1, text = "Find Employee by Name")

        #Add Highest Radio Button
        rbHigh = Radiobutton(frame1, text = "Highest")

        #Add Lowest Radio Button
        rbLow = Radiobutton(frame1, text ="Lowest")

        #Add FindEmployee by Amount Button
        btFindEmployee_A = Button(frame1, text = "Find Employee by Amount")

        #Add WriteOutput Button
        btOutput = Button(frame1, text = "Write Output to File")

        #Add Cancel Button
        btCancel = Button(frame1, text = "Cancel")

        btReadFile.grid(row = 1, column = 2, sticky='w')
        btShowPayroll.grid(row = 2, column = 2, sticky='w')
        btFindEmployee.grid(row = 2, column = 4, sticky='w')
        rbHigh.grid(row = 3, column = 2, sticky='w')
        rbLow.grid(row = 3, column = 4, sticky='w')
        btFindEmployee_A.grid(row = 3, column = 6, sticky='w')
        btOutput.grid(row = 4, column = 2, sticky='w')
        btCancel.grid(row = 4, column = 4, sticky='w')

        #Add Frame 2
        frame2 = Frame(window, bg='red')
        frame2.pack(fill='both') # try without `fill`

        label2 = Label(frame2, text='Label in bottom Frame', bg='green')
        label2.pack()

        window.mainloop()

PayrollSummary()