如何从列表中生成一列复选框
How to generate a column of checkboxes from a list
我最近发现了 PySimpleGUI。当时看好像可以省很多功夫。
我想使用 PySimpleGUI 作为界面为 jpeg 图像创建 'tagger'。
我在一个简单的 python 列表中有一长串标记词。
我取得了一些成功,因为我可以创建一行复选框,但不能创建一列。
我最初的研究发现了一个生成器可以用来制作许多复选框。
我的目标是让 3 列充满列表生成的复选框。
生成器代码段
我找到了这段代码,用于从这个 PySimpleGUI 生成按钮 page. 然后针对复选框进行了修改。我有工作函数,但我无法将它们格式化为列。
def CBtn(BoxText):
return sg.Checkbox(BoxText, size=(8, 1), default=False)
column2 = sg.Column([[sg.Text('User Id:')], [CBtn(Bx) for Bx in Tags1]])
主要代码
#!/usr/bin/env python3
import PySimpleGUI as sg
sg.theme('Dark Red')
TaggerList = ["viking", "saddle", "beast", "ze", "princess", "vet", "art", "two", "hood", "mosaic",
"viking1", "saddle1", "beast1", "ze1", "princess1", "vet1", "art1", "two1", "hood1", "mosaic1"]
TaggerListLen = len(TaggerList)
Tags1 = TaggerList[:int(TaggerListLen/3)]
Tags2 = TaggerList[int(TaggerListLen/3):int(TaggerListLen/3*2)]
Tags3 = TaggerList[int(TaggerListLen/3*2):]
def CBtn(BoxText):
return sg.Checkbox(BoxText, size=(8, 1), default=False)
column2 = [[sg.Text('Column 2', justification='center', size=(10, 1))], [CBtn(Bx) for Bx in Tags2]]
column5 = sg.Column([[sg.Checkbox("BoxText1", size=(8, 1), default=False)],
[sg.Checkbox("BoxText2", size=(8, 1), default=False)],
[sg.Checkbox("BoxText3", size=(8, 1), default=False)],
[sg.Checkbox("BoxText4", size=(8, 1), default=False)]])
layout = [
[sg.Menu(menu_def, tearoff=True)],
[sg.Text('Image Tagger', size=(
30, 1), justification='center', font=("Helvetica", 25), relief=sg.RELIEF_RIDGE)],
[sg.Text('Your Folder', size=(15, 1), justification='right'),
sg.InputText('Default Folder'), sg.FolderBrowse()],
[sg.Column(column2)]
[column5]
window = sg.Window('Everything bagel', layout)
在屏幕截图中显示生成的复选框设置在一行而不是列中。所以 sg.Column(column2)
是一行。当我手动添加 column5
的复选框时,我得到了一个正确的列。
格式
当我使用生成器定义时,我得到这个:[CBtn('1'), CBtn('2'), CBtn('3'), CBtn('log'), CBtn('ln'), CBtn('-')],
我正在寻找这样的东西:[[CBtn('1')], [CBtn('2')], [CBtn('3')], [CBtn('log')], [CBtn('ln')], [CBtn('-')]],
因为这遵循手册 column5 格式。
我已经尝试了很多生成器的变体,但 def
都没有成功。
这是我尝试实现上述格式的示例。
column1 = [[sg.Text('Column 1', justification='center', size=(10, 1))], [BaseTag.append([CBtn(Bx)]) for Bx in Tags1]]
但是我得到一个 AttributeError: 'NoneType' object has no attribute 'ParentContainer'
决赛
这应该很容易。我想,我过度弯曲了框架。
PySimplegui 看起来不错,但经过几个小时的无路可走,我想知道。
据我所知,对象的批量生产只能在一个简单的循环中完成。
代码修改:.
1. [[CBtn(i)] for i in range(len(Tags2))]
2. 'column2'和'column5'分别修改为'column2'和'column5'。
3. 在 'layout' 中添加,因为没有逗号或括号; column2)], column5]]
def CBtn(BoxText):
return sg.Checkbox(BoxText, size=(8, 1), default=False)
col2 = [[CBtn(i)] for i in range(len(Tags2))]
col5 = sg.Column([[sg.Checkbox("BoxText1", size=(8, 1), default=False)],
[sg.Checkbox("BoxText2", size=(8, 1), default=False)],
[sg.Checkbox("BoxText3", size=(8, 1), default=False)],
[sg.Checkbox("BoxText4", size=(8, 1), default=False)]])
layout = [[sg.Menu(menu_def, tearoff=True)],
[sg.Text('Image Tagger', size=(
30, 1), justification='center', font=("Helvetica", 25), relief=sg.RELIEF_RIDGE)],
[sg.Text('Your Folder', size=(15, 1), justification='right'),
sg.InputText('Default Folder'), sg.FolderBrowse()],
[sg.Text('Column 2', justification='center', size=(10, 1))],
[sg.Column(col2)],
[col5]]
window = sg.Window('Everything bagel', layout)
这几乎行得通。我需要稍微更新生成器以获得我想要的。
生成的列只有数字。我需要添加关键字。
修改后的代码:
column1 = [[CBtn(Tags1[i])] for i in range(len(Tags1))]
然后用列表中的值填充该列。
现在来看看这个框架有多简单。
我最近发现了 PySimpleGUI。当时看好像可以省很多功夫。
我想使用 PySimpleGUI 作为界面为 jpeg 图像创建 'tagger'。
我在一个简单的 python 列表中有一长串标记词。
我取得了一些成功,因为我可以创建一行复选框,但不能创建一列。
我最初的研究发现了一个生成器可以用来制作许多复选框。
我的目标是让 3 列充满列表生成的复选框。
生成器代码段
我找到了这段代码,用于从这个 PySimpleGUI 生成按钮 page. 然后针对复选框进行了修改。我有工作函数,但我无法将它们格式化为列。
def CBtn(BoxText):
return sg.Checkbox(BoxText, size=(8, 1), default=False)
column2 = sg.Column([[sg.Text('User Id:')], [CBtn(Bx) for Bx in Tags1]])
主要代码
#!/usr/bin/env python3
import PySimpleGUI as sg
sg.theme('Dark Red')
TaggerList = ["viking", "saddle", "beast", "ze", "princess", "vet", "art", "two", "hood", "mosaic",
"viking1", "saddle1", "beast1", "ze1", "princess1", "vet1", "art1", "two1", "hood1", "mosaic1"]
TaggerListLen = len(TaggerList)
Tags1 = TaggerList[:int(TaggerListLen/3)]
Tags2 = TaggerList[int(TaggerListLen/3):int(TaggerListLen/3*2)]
Tags3 = TaggerList[int(TaggerListLen/3*2):]
def CBtn(BoxText):
return sg.Checkbox(BoxText, size=(8, 1), default=False)
column2 = [[sg.Text('Column 2', justification='center', size=(10, 1))], [CBtn(Bx) for Bx in Tags2]]
column5 = sg.Column([[sg.Checkbox("BoxText1", size=(8, 1), default=False)],
[sg.Checkbox("BoxText2", size=(8, 1), default=False)],
[sg.Checkbox("BoxText3", size=(8, 1), default=False)],
[sg.Checkbox("BoxText4", size=(8, 1), default=False)]])
layout = [
[sg.Menu(menu_def, tearoff=True)],
[sg.Text('Image Tagger', size=(
30, 1), justification='center', font=("Helvetica", 25), relief=sg.RELIEF_RIDGE)],
[sg.Text('Your Folder', size=(15, 1), justification='right'),
sg.InputText('Default Folder'), sg.FolderBrowse()],
[sg.Column(column2)]
[column5]
window = sg.Window('Everything bagel', layout)
在屏幕截图中显示生成的复选框设置在一行而不是列中。所以 sg.Column(column2)
是一行。当我手动添加 column5
的复选框时,我得到了一个正确的列。
格式
当我使用生成器定义时,我得到这个:[CBtn('1'), CBtn('2'), CBtn('3'), CBtn('log'), CBtn('ln'), CBtn('-')],
我正在寻找这样的东西:[[CBtn('1')], [CBtn('2')], [CBtn('3')], [CBtn('log')], [CBtn('ln')], [CBtn('-')]],
因为这遵循手册 column5 格式。
我已经尝试了很多生成器的变体,但 def
都没有成功。
这是我尝试实现上述格式的示例。
column1 = [[sg.Text('Column 1', justification='center', size=(10, 1))], [BaseTag.append([CBtn(Bx)]) for Bx in Tags1]]
但是我得到一个 AttributeError: 'NoneType' object has no attribute 'ParentContainer'
决赛
这应该很容易。我想,我过度弯曲了框架。 PySimplegui 看起来不错,但经过几个小时的无路可走,我想知道。
据我所知,对象的批量生产只能在一个简单的循环中完成。 代码修改:. 1. [[CBtn(i)] for i in range(len(Tags2))] 2. 'column2'和'column5'分别修改为'column2'和'column5'。 3. 在 'layout' 中添加,因为没有逗号或括号; column2)], column5]]
def CBtn(BoxText):
return sg.Checkbox(BoxText, size=(8, 1), default=False)
col2 = [[CBtn(i)] for i in range(len(Tags2))]
col5 = sg.Column([[sg.Checkbox("BoxText1", size=(8, 1), default=False)],
[sg.Checkbox("BoxText2", size=(8, 1), default=False)],
[sg.Checkbox("BoxText3", size=(8, 1), default=False)],
[sg.Checkbox("BoxText4", size=(8, 1), default=False)]])
layout = [[sg.Menu(menu_def, tearoff=True)],
[sg.Text('Image Tagger', size=(
30, 1), justification='center', font=("Helvetica", 25), relief=sg.RELIEF_RIDGE)],
[sg.Text('Your Folder', size=(15, 1), justification='right'),
sg.InputText('Default Folder'), sg.FolderBrowse()],
[sg.Text('Column 2', justification='center', size=(10, 1))],
[sg.Column(col2)],
[col5]]
window = sg.Window('Everything bagel', layout)
这几乎行得通。我需要稍微更新生成器以获得我想要的。 生成的列只有数字。我需要添加关键字。
修改后的代码:
column1 = [[CBtn(Tags1[i])] for i in range(len(Tags1))]
然后用列表中的值填充该列。 现在来看看这个框架有多简单。