Python Can';t将按钮置于所需区域的tkinter中
以下是输出屏幕: 我想将按钮5和6放置在各自行的中心,即垂直对齐按钮1和按钮2 另外,我想缩小按钮3和按钮4之间的间距,但当我尝试时,整个窗口都会发生变化,即使在将这些按钮放置在单独的框架中之后也是如此 代码如下: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():
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()