【问题标题】:PySimpleGUI radio button return text, not True/FalsePySimpleGUI 单选按钮返回文本,而不是 True/False
【发布时间】:2022-01-02 16:59:11
【问题描述】:

我正在尝试创建一个简单的表单来快速填充 Excel 文件。

最终的 excel 文件中的列是“数字”(输入 ID 号)、“其他详细信息”(如果需要添加特定详细信息,则输入文本),然后是与我正在尝试的对象的属性相关的几列记录,每个都有几个选项。

对于后面的这些列,我看到 PySimpleGUI 中的单选按钮返回 True/False,而我只想将单选按钮的文本保存在单个列中。如何将每个按钮的 True/False 转换为与按钮相关的文本?

解决方法如下:

import PySimpleGUI as sg
import pandas as pd

EXCEL_FILE = 'data_entry.xlsx'
df = pd.read_excel(EXCEL_FILE)

lst = ('English', 'Chinese', 'Japanese', 'Russian')
lst2 = ('English', 'Chinese', 'Japanese', 'Russian')
lst3 = ('English', 'Chinese', 'Japanese', 'Russian')
lst4 = ('English', 'Chinese', 'Japanese', 'Russian')
lst5 = ('English', 'Chinese', 'Japanese', 'Russian')

layout = [
[sg.Input('', key='INPUT 1')], 
[sg.Radio(text, "Radio", enable_events=True, key=f"Radio {i}")
    for i, text in enumerate(lst)],
[sg.Radio(text, "Radio2", enable_events=True, key=f"Radio2 {i}")
    for i, text in enumerate(lst2)],
[sg.Radio(text, "Radio3", enable_events=True, key=f"Radio3 {i}")
    for i, text in enumerate(lst3)],
[sg.Radio(text, "Radio4", enable_events=True, key=f"Radio4 {i}")
    for i, text in enumerate(lst4)],
[sg.Radio(text, "Radio5", enable_events=True, key=f"Radio5 {i}")
    for i, text in enumerate(lst5)],
[sg.Input('', key='INPUT 2')],

[sg.Push(), sg.Button("Go"), sg.Button('Exit')],
]

window = sg.Window("test", layout, finalize=True)

def clear_input():
    for key in values:
        window[key]('')
    return None

while True:

    event, values = window.read()

    if event in (sg.WINDOW_CLOSED, 'Exit'):
        break

    elif event == 'Go':
        """
        radio_value = window[event].TKIntVar.get()
        col = radio_value % 1000                        # count from 0
        row = (radio_value - col) % 100000              # count from 0
        container = radio_value // 100000               # count from 1
        # print(container, row, col)
        """
        radio_value = window['Radio 0'].TKIntVar.get()
        text = lst[radio_value % 1000] if radio_value else None
    
        radio_value2 = window['Radio2 0'].TKIntVar.get()
        text2 = lst2[radio_value2 % 1000] if radio_value2 else None
    
        radio_value3 = window['Radio3 0'].TKIntVar.get()
        text3 = lst2[radio_value3 % 1000] if radio_value3 else None       
    
        radio_value4 = window['Radio4 0'].TKIntVar.get()
        text4 = lst2[radio_value4 % 1000] if radio_value4 else None

        radio_value5 = window['Radio5 0'].TKIntVar.get()
        text5 = lst2[radio_value5 % 1000] if radio_value5 else None
    
        record = [values['INPUT 1'], text, text2, text3, text4, text5, values['INPUT 2']]
        print(record)
        df = df.append(record, ignore_index=True)
        df.to_excel(EXCEL_FILE, index=False)
        sg.popup('Data saved!')
        clear_input()

window.close()

【问题讨论】:

    标签: python pysimplegui


    【解决方案1】:

    您不能直接从事件值中获取文本,因为它被定义为一个整数变量来存储值,但您可以通过element.Text 获取它。

    要获取元素的值,您可以从字典values 中获取它们。对于很多 Radio 元素,你可以扫描哪个 Radio 的值为True 或者在下面的脚本中找到代码来获取选择的索引。

    import PySimpleGUI as sg
    
    lst = ('English', 'Chinese', 'Japanese', 'Russian')
    
    layout = [
        [sg.Input('', key='INPUT 1')],
        [sg.Radio(text, "Radio", enable_events=True, key=f"Radio {i}")
            for i, text in enumerate(lst)],
        [sg.Input('', key='INPUT 2')],
        [sg.Push(), sg.Button("Go"), sg.Button('Exit')],
    ]
    
    window = sg.Window("test", layout, finalize=True)
    
    while True:
    
        event, values = window.read()
    
        if event in (sg.WINDOW_CLOSED, 'Exit'):
            break
        elif event.startswith("Radio"):
            text = window[event].Text
            print(text)
        elif event == 'Go':
            """
            radio_value = window[event].TKIntVar.get()
            col = radio_value % 1000                        # count from 0
            row = (radio_value - col) % 100000              # count from 0
            container = radio_value // 100000               # count from 1
            # print(container, row, col)
            """
            radio_value = window['Radio 0'].TKIntVar.get()
            text = lst[radio_value % 1000] if radio_value else None
            record = [values['INPUT 1'], text, values['INPUT 2']]
            print(record)
    
    window.close()
    

    【讨论】:

    • 嗨 - 谢谢。我可以看到这从完美的单选按钮打印文本。我现在的问题是我正在努力修改您的答案以处理多个单选按钮和我的其他元素。我的布局是一个 InputText 字段、5 个单选按钮,然后是最后一个 InputText 字段。如何将这些组合成一个列表(然后我可以将其写入我已经设置的 excel 文件)?
    • 如上更新。
    • 我在上面的问题中添加了我的(几乎)最终代码。
    猜你喜欢
    • 2019-03-24
    • 1970-01-01
    • 1970-01-01
    • 2016-03-23
    • 2014-04-24
    相关资源
    最近更新 更多