我是一名生物工程专业的学生,正在攻读我所在大学的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()中指定一行,那么这些选项会相互重叠。
答案 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,然后网格到该行号。