Tkinter 中的复选按钮未正确对齐
Checkbuttons not properly aligning in Tkinter
我是一名生物工程专业的学生,在我的大学从事 Capstone 项目,该项目的一部分需要一些编码。 None 我们小组成员知道如何编码,所以我自己学习 python 并尝试使用 Tkinter 创建 GUI。鉴于编码的原因,我对编程非常陌生,因此,作为一个预警,我的代码可能写得相当糟糕。
所以进入正题;我在让我的 Checkbuttons 正确对齐时遇到问题。本质上发生的情况是第一个 Checkbutton 组在第 0 列中的第 3-6 行对齐(我认为,不是 100% 确定,但它们在我想要的位置)。然后我在第 1 列中创建了第二个 Checkbutton 组,我想要Checkbuttons 从第 3 行开始 - 无论如何,但它们从第 7 行开始并跨越到任何时候。我创建的每个后续 Checkbutton 组都会发生这种情况。
代码如下:
import sys
from Tkinter import *
import tkMessageBox
import tkFileDialog
from PIL import ImageTk, Image
root = Tk()
root.geometry('900x700')
root.title('IBID 2.0')
ilabel1 = Label(root, text=' Measurement',font=("Bold",18)).grid(row=1,column=0)
datatype = {'Joint Angle' : 0,
'Joint Acceleration' : 0,
'Ground Reaction Force' : 0,
'Muscle Activation' : 0
}
for measure in datatype:
datatype[measure] = IntVar()
dt_cb = Checkbutton(root, text=measure, variable=datatype[measure])
dt_cb.grid(column=0, sticky='W', padx=20)
ilabel2 = Label(root, text='Muscle Group(s)',font= ("Bold",18),padx=30).grid(row=1,column=1)
emg_groups = {'Quadriceps' : 0,
'Hamstrings' : 0,
'Calves' : 0
}
for measure in emg_groups:
emg_groups[measure] = IntVar()
emg_cb = Checkbutton(root, text=measure, variable=emg_groups[measure])
emg_cb.grid(column=1, sticky='W', padx=20)
ilabel3 = Label(root, text='Ground Reaction Force',font=("Bold",18),padx=30).grid(row=1,column=2)
grf_groups = {'Ground Reaction Force' : 0,
'Gait' : 0,
}
for measure in grf_groups:
grf_groups[measure] = IntVar()
grf_cb = Checkbutton(root, text=measure, variable=grf_groups[measure])
grf_cb.grid(column=2, sticky='W', padx=40)
我确实找到了一个解决方法,我没有使用列表来创建我的复选按钮,而是继续单独制作每个按钮。我想我可以使用列表稍微清理一下代码,但我想我找不到将它们全部放在同一行的方法。如果我在 .grid() 中指定一行,则选项会相互重叠。
每次你调用 grid()
而不提供行时,Tkinter 会自动假设你想将它添加到底部的新行:
wdgt.grid(row=0, column=0)
wdgt.grid(column=1) # row=1 is assumed here
相反,您需要为您尝试网格化的新小部件提供行号:
for i, measure in enumerate(emg_groups):
emg_groups[measure] = IntVar()
emg_cb = Checkbutton(root, text=measure, variable=emg_groups[measure])
emg_cb.grid(column=1, row=i+2, sticky='W', padx=20)
和:
for i, measure in enumerate(grf_groups):
grf_groups[measure] = IntVar()
grf_cb = Checkbutton(root, text=measure, variable=grf_groups[measure])
grf_cb.grid(column=2, row=i+2, sticky='W', padx=40)
使用 enumerate()
我们在迭代的每个循环中得到一个元组,i
是一个 0 索引计数器,当然 measure
是对象本身。由于您的 Label()
从第 1 行开始(您可能希望更改为从第 0 行开始),因此我们每次都需要向索引添加 2,然后将网格添加到该行号。
我是一名生物工程专业的学生,在我的大学从事 Capstone 项目,该项目的一部分需要一些编码。 None 我们小组成员知道如何编码,所以我自己学习 python 并尝试使用 Tkinter 创建 GUI。鉴于编码的原因,我对编程非常陌生,因此,作为一个预警,我的代码可能写得相当糟糕。
所以进入正题;我在让我的 Checkbuttons 正确对齐时遇到问题。本质上发生的情况是第一个 Checkbutton 组在第 0 列中的第 3-6 行对齐(我认为,不是 100% 确定,但它们在我想要的位置)。然后我在第 1 列中创建了第二个 Checkbutton 组,我想要Checkbuttons 从第 3 行开始 - 无论如何,但它们从第 7 行开始并跨越到任何时候。我创建的每个后续 Checkbutton 组都会发生这种情况。
代码如下:
import sys
from Tkinter import *
import tkMessageBox
import tkFileDialog
from PIL import ImageTk, Image
root = Tk()
root.geometry('900x700')
root.title('IBID 2.0')
ilabel1 = Label(root, text=' Measurement',font=("Bold",18)).grid(row=1,column=0)
datatype = {'Joint Angle' : 0,
'Joint Acceleration' : 0,
'Ground Reaction Force' : 0,
'Muscle Activation' : 0
}
for measure in datatype:
datatype[measure] = IntVar()
dt_cb = Checkbutton(root, text=measure, variable=datatype[measure])
dt_cb.grid(column=0, sticky='W', padx=20)
ilabel2 = Label(root, text='Muscle Group(s)',font= ("Bold",18),padx=30).grid(row=1,column=1)
emg_groups = {'Quadriceps' : 0,
'Hamstrings' : 0,
'Calves' : 0
}
for measure in emg_groups:
emg_groups[measure] = IntVar()
emg_cb = Checkbutton(root, text=measure, variable=emg_groups[measure])
emg_cb.grid(column=1, sticky='W', padx=20)
ilabel3 = Label(root, text='Ground Reaction Force',font=("Bold",18),padx=30).grid(row=1,column=2)
grf_groups = {'Ground Reaction Force' : 0,
'Gait' : 0,
}
for measure in grf_groups:
grf_groups[measure] = IntVar()
grf_cb = Checkbutton(root, text=measure, variable=grf_groups[measure])
grf_cb.grid(column=2, sticky='W', padx=40)
我确实找到了一个解决方法,我没有使用列表来创建我的复选按钮,而是继续单独制作每个按钮。我想我可以使用列表稍微清理一下代码,但我想我找不到将它们全部放在同一行的方法。如果我在 .grid() 中指定一行,则选项会相互重叠。
每次你调用 grid()
而不提供行时,Tkinter 会自动假设你想将它添加到底部的新行:
wdgt.grid(row=0, column=0)
wdgt.grid(column=1) # row=1 is assumed here
相反,您需要为您尝试网格化的新小部件提供行号:
for i, measure in enumerate(emg_groups):
emg_groups[measure] = IntVar()
emg_cb = Checkbutton(root, text=measure, variable=emg_groups[measure])
emg_cb.grid(column=1, row=i+2, sticky='W', padx=20)
和:
for i, measure in enumerate(grf_groups):
grf_groups[measure] = IntVar()
grf_cb = Checkbutton(root, text=measure, variable=grf_groups[measure])
grf_cb.grid(column=2, row=i+2, sticky='W', padx=40)
使用 enumerate()
我们在迭代的每个循环中得到一个元组,i
是一个 0 索引计数器,当然 measure
是对象本身。由于您的 Label()
从第 1 行开始(您可能希望更改为从第 0 行开始),因此我们每次都需要向索引添加 2,然后将网格添加到该行号。