【发布时间】:2021-09-22 09:27:31
【问题描述】:
请看下面的sn-p:
import tkinter as tk
# Grid variables
width = 6
mid_left = int(width/2 - 1)
mid_right = int(width/2)
pady_5 = 5
# Main window
main_window = tk.Tk()
main_window.title('Controller')
# Top frame
top_frame = tk.Frame(main_window)
top_frame.grid(row=0, pady=pady_5)
label_0 = tk.Label(top_frame, text='Arm Movement')
label_0.grid(row=0, columnspan=width, pady=pady_5)
button_1 = tk.Button(top_frame, text='Move to Center Position')
button_1.grid(row=1, column=mid_left, sticky='e', pady=pady_5)
button_2 = tk.Button(top_frame, text='Move to Last Position')
button_2.grid(row=1, column=mid_right, sticky='w', pady=pady_5)
entry_3_1 = tk.Entry(top_frame)
entry_3_1.grid(row=2, column=mid_left, pady=pady_5)
label_3_1 = tk.Label(top_frame, text='X:')
label_3_1.grid(row=2, column=mid_left-1, sticky='e', pady=pady_5)
entry_3_2 = tk.Entry(top_frame)
entry_3_2.grid(row=2, column=mid_right+1, pady=pady_5)
label_3_2 = tk.Label(top_frame, text='Y:')
label_3_2.grid(row=2, column=mid_right, sticky='e', pady=pady_5)
button_3 = tk.Button(top_frame, text='Move!')
button_3.grid(row=2, column=mid_right+2, sticky='w', pady=pady_5)
# Center frame
center_frame = tk.Frame(main_window)
center_frame.grid(row=1, pady=pady_5)
label_0 = tk.Label(center_frame, text='Execution')
label_0.grid(row=0, columnspan=width, pady=pady_5)
button_1 = tk.Button(center_frame, text='Quick Routine')
button_1.grid(row=1, column=mid_left, sticky='e', pady=pady_5)
button_2 = tk.Button(center_frame, text='Full Routine')
button_2.grid(row=1, column=mid_right, sticky='w', pady=pady_5)
# Bottom frame
bottom_frame = tk.Frame(main_window)
bottom_frame.grid(row=2, pady=pady_5)
label_0 = tk.Label(bottom_frame, text='Reconstruction')
label_0.grid(row=0, columnspan=width, pady=pady_5)
button_1 = tk.Button(bottom_frame, text='Quick')
button_1.grid(row=1, column=mid_left, sticky='e', pady=pady_5)
button_2 = tk.Button(bottom_frame, text='Full')
button_2.grid(row=1, column=mid_right, sticky='w', pady=pady_5)
# Open main window
main_window.mainloop()
如果您运行此示例,您会看到最上面的两个按钮“移至中心位置”和“移至最后位置”不像其他按钮那样居中。此外,输入字段似乎是任意放置的,即使它们应该彼此相邻并居中。是什么导致了这些不一致,我该如何解决?
或者有没有比使用grid 方法更好的方法开始 来放置GUI 元素?我遇到了“愚蠢”的问题,例如在偶数和奇数的网格列之间“必须决定”:选择偶数列(例如上面的示例)并且您不能居中元素(因为没有中心列) 与选择奇数列,您不能将两个元素并排居中。使用 pack 方法很快就失宠了,因为它太有限了。
更新:只是想说明,无论如何调整代码,grid 方法中似乎都有一层不可见的额外代码,它可以任意移动元素。似乎不可能获得干净、可靠的定位。看看这里的按钮位置,特别是使用sticky='e' 或='w' 对按钮Move to Center Position 和Move to Last Position 的定位完全没有效果:
import tkinter as tk
# Grid variables
width = 6
mid_left = int(width/2 - 1)
mid_right = int(width/2)
padx_5 = 10
pady_5 = 5
# Main window
main_window = tk.Tk()
main_window.title('Controller')
# Top frame
top_frame = tk.Frame(main_window)
top_frame.grid(row=0, pady=pady_5)
label_0 = tk.Label(top_frame, text='Arm Movement')
label_0.grid(row=0, columnspan=width, pady=pady_5)
button_1 = tk.Button(top_frame, text='Move to Center Position')
button_1.grid(row=3, column=mid_right, padx=padx_5, pady=pady_5)
button_2 = tk.Button(top_frame, text='Move to Last Position')
button_2.grid(row=3, column=mid_left, padx=padx_5, pady=pady_5)
label_3_1 = tk.Label(top_frame, text='X [cm]:')
label_3_1.grid(row=1, column=mid_left-1, sticky='e', padx=(20, 0), pady=pady_5)
entry_3_1 = tk.Entry(top_frame)
entry_3_1.grid(row=1, column=mid_left, pady=pady_5)
label_3_2 = tk.Label(top_frame, text='Y [cm]:')
label_3_2.grid(row=2, column=mid_left-1, sticky='e', padx=(20, 0), pady=pady_5)
entry_3_2 = tk.Entry(top_frame)
entry_3_2.grid(row=2, column=mid_left, pady=pady_5)
button_3 = tk.Button(top_frame, text='Move!')
button_3.grid(row=1, rowspan=2, column=mid_left+1, sticky='w', padx=padx_5, pady=pady_5)
# Center frame
center_frame = tk.Frame(main_window)
center_frame.grid(row=1, pady=pady_5)
label_0 = tk.Label(center_frame, text='Execution')
label_0.grid(row=0, columnspan=width, pady=pady_5)
button_1 = tk.Button(center_frame, text='Quick Routine')
button_1.grid(row=1, column=mid_left, padx=padx_5, pady=pady_5)
button_2 = tk.Button(center_frame, text='Full Routine')
button_2.grid(row=1, column=mid_right, padx=padx_5, pady=pady_5)
# Bottom frame
bottom_frame = tk.Frame(main_window)
bottom_frame.grid(row=2, pady=pady_5)
label_0 = tk.Label(bottom_frame, text='Reconstruction')
label_0.grid(row=0, columnspan=width, pady=pady_5)
button_1 = tk.Button(bottom_frame, text='Quick')
button_1.grid(row=1, column=mid_left, padx=padx_5, pady=pady_5)
button_2 = tk.Button(bottom_frame, text='Full')
button_2.grid(row=1, column=mid_right, padx=padx_5, pady=pady_5)
# Open main window
main_window.mainloop()
【问题讨论】:
-
您可以使用
.place,它允许您将您的小部件放置在主控器中您希望的任何位置 -
查看
columnspan和rowspan。 -
谢谢,我会调查
place...我也在玩columnspan和rowspan,但发现它们在这种情况下没有帮助,因为它们似乎只是在转移以一种不可预知的方式围绕着我的按钮。如果人们能够找出tkinter背后的机制会很有帮助,即如何根据输入参数/变量以数学方式计算位置、大小等。或者简单地说,如果事情会更一致,需要更少的巫术 -
我建议你使用框架,其实我也有点困惑,但是......我通常使用框架(允许在布局管理器之间切换)
-
好的,将尝试按框架对元素进行分组...顺便说一句,布局管理器是什么?
标签: python user-interface tkinter button grid