Skip to main content
 首页 » 编程设计

python之PySimpleGUI 中 InputText 的 Read() 方法仅读取具有可变布局的最后一行

2024年11月24日37del

我正在使用 PySimpleGUI 库,并尝试制作一个 GUI(下面的代码)来输入密码字谜(基本上与填字游戏的格式相同)。我希望我的 GUI 是一组指定尺寸的文本框,可以包含数字或字母。

它构建了一个格式正确的 GUI ( built GUI ),但是当我在每个框中输入数字 1-9 ( filled GUI ) 并单击“确定”时,打印到控制台的输出是:“7 ,8,9,,,,,,,", 所以我假设它只读取最后一组输入。如果我将最后一行留空并像以前一样填充前两行,则会将“,,,,,,,,”输出到控制台。我尝试将列表理解更改为 for 循环并得到相同的结果,但是当我对布局(下面的代码)进行硬编码并输入 1-9 时,我得到了所需的“1,2,3,4,5,6,7 ,8,9,”。如何使用变量实现 PySimpleGUI 的布局?

# original code 
import PySimpleGUI as sg 
 
def entryGUI(length, width): 
    line = [sg.InputText('', size=(3, 1)) for i in range(length)] 
 
    entryLayout = [line for i in range(width)] 
    entryLayout.append([sg.CloseButton("OK"), sg.CloseButton("Cancel")]) 
 
    entryWin = sg.Window("CodeWord Solver").Layout(entryLayout) 
    button, values = entryWin.Read() 
 
    for value in values: 
        print(value + ",", end="") 
 
entryGUI(3, 3) 
# hardcoded code 
import PySimpleGUI as sg 
 
def entryGUI(length, width): 
    entryLayout = [ 
        [sg.InputText('', size=(3, 1)), sg.InputText('', size=(3, 1)), sg.InputText('', size=(3, 1))], 
        [sg.InputText('', size=(3, 1)), sg.InputText('', size=(3, 1)), sg.InputText('', size=(3, 1))], 
        [sg.InputText('', size=(3, 1)), sg.InputText('', size=(3, 1)), sg.InputText('', size=(3, 1))], 
        [sg.CloseButton("OK"), sg.CloseButton("Cancel")] 
    ] 
 
    entryWin = sg.Window("CodeWord Solver").Layout(entryLayout) 
    button, values = entryWin.Read() 
 
    # if button != "OK": 
    #     exit() 
    # else: 
    for value in values: 
        print(value + ",", end="") 
        #return values 
 
entryGUI(3, 3) 

请您参考如下方法:

您遇到的问题是您创建了一个名为 line 的变量,它是一个包含 3 个对象的列表。元素是单独的对象。代码实例化了 3 个 InputText 元素并将它们堆叠在一起。这意味着您在每行中使用完全相同的 3 个输入元素。

解决此问题的方法是创建 9 个 InputText 元素,就像您手动创建的那样,但不是在循环内构建。

试试这段代码:

import PySimpleGUI as sg 
 
def entryGUI(length, width): 
    entryLayout = [] 
    for i in range(width): 
        line = [sg.InputText('', size=(3, 1)) for i in range(length)] 
        entryLayout.append(line) 
    entryLayout.append([sg.CloseButton("OK"), sg.CloseButton("Cancel")]) 
 
    entryWin = sg.Window("CodeWord Solver").Layout(entryLayout) 
    button, values = entryWin.Read() 
    print (values) 
    for value in values: 
        print(value + ",", end="") 
 
entryGUI(3, 3) 

或者更短更简单的:

import PySimpleGUI as sg 
 
def entryGUI(length, width): 
    entryLayout = [[sg.InputText('', size=(3, 1)) for i in range(length)] for _ in range(width)] + [[sg.CloseButton("OK"), sg.CloseButton("Cancel")]] 
 
    entryWin = sg.Window("CodeWord Solver").Layout(entryLayout) 
    button, values = entryWin.Read() 
    print(','.join(values)) 
 
entryGUI(3, 3)