如何从列表中生成一列复选框

2024-06-21 20:43:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近发现了PySimpleGUI。当时看起来它可以帮我省下很多工作

我想使用PySimpleGUI作为界面为jpeg图像创建一个“标记器”

我在一个简单的python列表中有一长串标记词

我已经取得了一些成功,因为我可以创建一行复选框,但不能创建一列

我最初的研究发现了一个生成器,可以用来制作许多复选框。
我的目标是用列表生成的检查框填充3列

生成器代码段

我发现这段代码是用来从这个PySimpleGUIpage.生成按钮的,然后对复选框进行了修改。我有工作函数,但无法将它们格式化为列

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]])

Main代码


#!/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的复选框时,我得到了一个正确的列

Screen_Capture

Format

当我使用生成器定义时,我得到如下结果:[CBtn('1'), CBtn('2'), CBtn('3'), CBtn('log'), CBtn('ln'), CBtn('-')],

我在找这样的东西:[[CBtn('1')], [CBtn('2')], [CBtn('3')], [CBtn('log')], [CBtn('ln')], [CBtn('-')]], 这遵循手册第5列的格式

我已经尝试了生成器和def的许多变体,但没有取得多大成功。 下面是我尝试实现上述格式的一个示例

column1 = [[sg.Text('Column 1', justification='center', size=(10, 1))], [BaseTag.append([CBtn(Bx)]) for Bx in Tags1]]

但是我得到了一个AttributeError:'NoneType'对象没有属性'ParentContainer'

Final

这应该很容易。我想,我把框架弯曲得太厉害了。 PySimplegui看起来不错,但在几个小时的无人驾驶之后,我想知道


Tags: textfalsedefaultsizedefcolumnsg复选框
2条回答

据我所知,大规模生产的对象只能在一个简单的循环。 对代码的修改:。 1.[[CBtn(i)]表示范围内的i(len(Tags2))] 2. '第2栏和第5栏分别更改为第2栏和第5栏。 3.在“布局”中添加,因为没有逗号或括号;第二栏]],第五栏]]

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))]

然后用列表中的值填充该列。 现在来看看这个框架有多简单

相关问题 更多 >