#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()