Python Can';t将按钮置于所需区域的tkinter中

Python Can';t将按钮置于所需区域的tkinter中,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,以下是输出屏幕: 我想将按钮5和6放置在各自行的中心,即垂直对齐按钮1和按钮2 另外,我想缩小按钮3和按钮4之间的间距,但当我尝试时,整个窗口都会发生变化,即使在将这些按钮放置在单独的框架中之后也是如此 代码如下: import tkinter as tk from tkinter import ttk from PIL import Image,ImageTk from tkcalendar import Calendar, DateEntry def something():

以下是输出屏幕:

我想将按钮5和6放置在各自行的中心,即垂直对齐按钮1和按钮2

另外,我想缩小按钮3和按钮4之间的间距,但当我尝试时,整个窗口都会发生变化,即使在将这些按钮放置在单独的框架中之后也是如此

代码如下:

import tkinter as tk
from tkinter import ttk
from PIL import Image,ImageTk

from tkcalendar import Calendar, DateEntry

def something():
    pass

def date_entry(frame):
    top = tk.Toplevel(frame)
    ttk.Label(top, text='Choose date').pack(padx=10, pady=10)
    cal = DateEntry(top, width=12, background='darkblue',
                    foreground='white', borderwidth=2)
    cal.pack(padx=10, pady=10)

def Home():
    root = tk.Tk()
    root.geometry('550x400')
    root.title('tkinter')
    root.config(bg = '#f4f5db')

    u_frame = tk.Frame(root)
    u_frame.grid(row= 0, column=0)

    headingLabel =  tk.Label(u_frame, text = ' Heading ', font='candara 30 bold',compound='left',bg='#f4f5db'  )
    headingLabel.grid(row = 0,column= 0)
    root.grid_columnconfigure(0, weight=1)

    u1_frame = tk.Frame(root,bg = '#f4f5db')
    u1_frame.grid(row=1, column = 0 )
    dateLabel = tk.Label(u1_frame, text = ' Date ', font = 'candara 14', bg = '#f7f7e8' ).grid(row =1, sticky = 'w')
    tk.Button(u1_frame, text='DateEntry', command= lambda: date_entry(u1_frame) , relief = 'sunken').grid(row=1,column=1, padx=10, pady=10)
    
    Label1 = tk.Label(u1_frame, text = 'Label 1', font = 'candara 14', bg = '#f7f7e8' ).grid(row =2,column = 0)
    Entry1 = tk.Entry(u1_frame, font = 'candara 12').grid(row = 2,column = 1, padx = 10, pady = 10)

    Button1 = tk.Button(u1_frame, text = 'Button1', command = something, font = 'candara 12', bg = 'white').grid(row = 3, column = 1)    

    label2 = tk.Label(u1_frame, text = 'label2 : ' , font = 'candara 14' , bg = '#f7f7e8').grid(row = 4, column =0)
    button2 = tk.Button(u1_frame, text = 'Button2', font = 'candara 12', bg = '#f7f7e8').grid(row = 4, column = 1, padx = 10, pady = 10)

    lowerFrame = tk.Frame(root , bg = 'white' ).grid(row = 5, column = 0)
    button3 = tk.Button(lowerFrame , text = 'Button3' , font = 'candara 12' , bg = '#f7f7e8' ).grid(row = 5, column = 0,sticky = 'w', padx = 20, pady = 10)
    button4 = tk.Button(lowerFrame, text = 'Button4', font = 'candara 12' , bg = '#f7f7e8').grid(row = 5, column = 1 , padx = 20, pady = 10)

    lowestFrame = tk.Frame(root, bg = 'white').grid(row = 6, column = 0)
    Button5 = tk.Button(lowestFrame, text = 'Button5',font = 'candara 12' , bg = '#f7f7e8' ).grid(row = 6, column = 1, padx = 20, pady = 10)
    button6 = tk.Button(lowestFrame,text = 'Button6', font = 'candara 12' ,bg = '#f7f7e8' ).grid(row=7, column = 1,  padx = 20, pady = 10)

    root.mainloop()

Home()

您已经在代码中正确使用了帧,但是定位需要做一些工作。
创建框架时,小部件(按钮、标签、框架)在框架中的位置与框架的父级分开。这允许您在一个框架中使用pack,在另一个框架中使用grid等有用的操作。

在代码中,您创建
u1\u框架作为根窗口的子窗口。然后制作一些标签和按钮作为
u1\u框架的子项。框架(小部件)中的标签和按钮不受根窗口位置的影响,因此您可以将其视为空窗口,从行/列0开始。
稍后,您将创建
lowerFrame
作为根窗口的子窗口。根窗口当前有两个小部件,
u\u-frame
u1\u-frame
。因为小部件在框架中的位置不会影响根窗口,所以行号将是2而不是5,并且
最下面的框架将是第3行而不是6行。这也意味着
lowerFrame
中的小部件应该是第0行而不是第5行,因为它们位于一个框架中,并且不受根窗口小部件的位置影响。这同样适用于
最下面的帧
,两个按钮的行应为0和1。

现在框架已正确定位,我们可以使用
columnspan
对齐您在问题中描述的按钮
columnspan
告诉Tkinter一个小部件需要占用多少网格列。通过将
columnspan=2
添加到
button5
button6
,它们现在将占据这两列,并且默认情况下将在两列中居中,这将提供您想要的位置。
由于框架现在已正确定位,按钮3和4现在也应位于正确的位置。我强烈建议的另一件事是在一行定义一个小部件,然后将它放在下一行。例如,如果您需要更改文本或获取条目的值,这允许您稍后参考小部件。

以下是固定代码:

    u_frame = tk.Frame(root)
    u_frame.grid(row = 0, column = 0)
    

    headingLabel =  tk.Label(u_frame, text = ' Heading ', font='candara 30 bold',compound='left',bg='#f4f5db'  )
    headingLabel.grid(row = 0,column= 0)
    root.grid_columnconfigure(0, weight=1)

    u1_frame = tk.Frame(root,bg = '#f4f5db')
    u1_frame.grid(row = 1, column = 0)
    dateLabel = tk.Label(u1_frame, text = ' Date ', font = 'candara 14', bg = '#f7f7e8' )
    dateLabel.grid(row =0, column = 0, sticky = 'w')
    tk.Button(u1_frame, text='DateEntry', command= lambda: date_entry(u1_frame) , relief = 'sunken').grid(row=0, column = 1, padx=10, pady=10)
    
    Label1 = tk.Label(u1_frame, text = 'Label 1', font = 'candara 14', bg = '#f7f7e8' )
    Label1.grid(row = 1, column = 0)
    Entry1 = tk.Entry(u1_frame, font = 'candara 12')
    Entry1.grid(row = 1, column = 1, padx = 10, pady = 10)

    Button1 = tk.Button(u1_frame, text = 'Button1', command = something, font = 'candara 12', bg = 'white')
    Button1.grid(row = 2, column = 0, columnspan = 2)    

    label2 = tk.Label(u1_frame, text = 'label2 : ' , font = 'candara 14' , bg = '#f7f7e8')
    label2.grid(row = 3, column =0)
    button2 = tk.Button(u1_frame, text = 'Button2', font = 'candara 12', bg = '#f7f7e8')
    button2.grid(row = 3, column = 1, padx = 10, pady = 10)

    lowerFrame = tk.Frame(root , bg = 'white' )
    lowerFrame.grid(row = 2, column = 0)
    button3 = tk.Button(lowerFrame , text = 'Button3' , font = 'candara 12' , bg = '#f7f7e8' )
    button3.grid(row = 0, column = 0, padx = 20, pady = 10)
    button4 = tk.Button(lowerFrame, text = 'Button4', font = 'candara 12' , bg = '#f7f7e8')
    button4.grid(row = 0, column = 1 , padx = 20, pady = 10)

    lowestFrame = tk.Frame(root, bg = 'white')
    lowestFrame.grid(row = 3, column = 0)
    button5 = tk.Button(lowestFrame, text = 'Button5',font = 'candara 12' , bg = '#f7f7e8' )
    button5.grid(row = 0, column = 0, columnspan = 2, padx = 20, pady = 10)
    button6 = tk.Button(lowestFrame,text = 'Button6', font = 'candara 12' ,bg = '#f7f7e8' )
    button6.grid(row=1, column = 0, columnspan = 2, padx = 20, pady = 10)
    root.mainloop()