检查按钮未在Tkinter中正确对齐

时间:2016-02-16 01:58:57

标签: python-2.7 tkinter row

我是一名生物工程专业的学生,​​正在攻读我所在大学的Capstone项目,该项目的一部分需要一些编码。我们的小组成员都不知道如何编码,因此我自己学习python并尝试使用Tkinter创建GUI。鉴于编码的原因,我对编程非常陌生,因此,作为一种预警,我的代码可能写得很差。

所以要达到目的;我在使我的Checkbuttons正确对齐时遇到问题。基本上会发生的是第一个Checkbutton组在第3-6行(我认为,但不是100%确定,但它们是我想要的位置)在第0列中对齐。然后在第1列中创建了第二个Checkbutton组,我想要检查按钮开始在第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)

我确实找到了一种解决方法,而不是使用列表创建我的Checkbuttons,我继续单独制作每个按钮。我想我可能能够使用列表清理一些代码,但我认为无法找到将它们放在同一行上的方法。如果我在.grid()中指定一行,那么这些选项会相互重叠。

1 个答案:

答案 0 :(得分:1)

每次在没有提供行的情况下调用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是对象本身。由于您在第1行启动了Label()(您可能希望更改为从第0行开始),因此我们每次需要在索引中添加2,然后网格到该行号。