有没有办法从 PySimpleGUI 中的 window 中删除某些输入而不删除其他输入?

Is there a way to remove certain inputs from a window in PySimpleGUI without removing others?

我是 新手 Python/PySimpleGUI 的新手,如果这太明显了,我深表歉意。 (此外,是的,这是我使用的来自 a Youtube tutorial 的代码,我不想对下面的代码有任何贡献。)

我有一个简单的程序,使用 pandas、pysimplegui 和 openpyxl 从最终用户(使用 PySimpleGUI windows)输入一组值到 Excel sheet;但是,有些字段我想保持不变(例如“日期”为 today.strftime("%m/%d/%y"))。这是我尝试过的方法:

将我想要的常量定义为变量:

bkey = 'My Name'
today = date.today()
date = today.strftime("%m/%d/%y")

然后,在 pysimplegui 中,让 sg.inputtext() 成为变量,例如:

[sg.Text('Entry By', size=(15,1)), sg.InputText(bkey)]

作为参考,这里有一个 window 以 key 作为输入:

[sg.Text('To Department', size=(15,1)), sg.InputText(key='To Department')]

然后在用户单击“提交”或“清除”的情况下调用 def Clear_Input():

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

我不知道为什么 clear_input() 会清除 window 中的所有值,因为对我来说它是说任何值都是 window == '' 中的键,因此不应清除任何未定义为键(例如 bkey)的内容。

如果我能提供更多信息,请告诉我,我很乐意提供。再次,新手,提前抱歉。

这里是完整的源代码:

import PySimpleGUI as sg
import pandas as pd
from datetime import date

#color add to window_height
sg.theme('Topanga')

EXCEL_FILE = r'C:\Users\User\Desktop\DataEntry.xlsx'
df = pd.read_excel(EXCEL_FILE)
bkey = 'My Name'
today = date.today()
date = today.strftime("%m/%d/%y")

layout = [
    [sg.Text('Please fill out the following fields:')],
    [sg.Text('Service Tag', size=(15,1)), sg.InputText(key='Tag')],
    [sg.Text('Serial Number (EPB)', size=(15,1)), sg.InputText(key='Serial Number')],
    [sg.Text('Type of Equipment', size=(15,1)), sg.Combo(['Desktop', 'Laptop', 'Monitor', 'Tablet'], key='Type of Equipment')],
    [sg.Text('New/Move', size=(15,1)), sg.InputText(key='New/Move')],
    [sg.Text('User\'s Name', size=(15,1)), sg.InputText(key='User\'s Name')],
    [sg.Text('From Room', size=(15,1)), sg.InputText(key='From Room')],
    [sg.Text('To Room', size=(15,1)), sg.InputText(key='To Room')],
    [sg.Text('To Department', size=(15,1)), sg.InputText(key='To Department')],
    [sg.Text('Date', size=(15,1)), sg.InputText(date)],
    [sg.Text('Attached Tag', size=(15,1)), sg.InputText(key='Attached Tag')],
    [sg.Text('Entry By', size=(15,1)), sg.InputText(bkey)],
    [sg.Submit(), sg.Button('Clear'), sg.Exit()]
]



window = sg.Window('simple data entry form', layout)

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


while True:
    event, values = window.read()
    if event == sg.WIN_CLOSED or event == 'Exit':
        break
    if event == 'Clear':
        clear_input()
    if event == 'Submit':
        df = df.append(values, ignore_index=True)
        df.to_excel(EXCEL_FILE, index=False)
        sg.popup('Data saved!')
        clear_input()

window.close()

PySimpleGui.Window.read() returns 两件事:eventvaluesevent 包含对触发消息的任何事件的描述。 values 包含布局中所有输入组件的字典。该字典中的键是 Input 项目中的 key 参数。 value 是该输入项的当前值。

因此,clear_input 只是 运行 通过布局中的 Input 元素集,并将它们的值设置为空白。

关键是名称,如 bkeykey 在运行时没有意义。他们只是持有对对象的引用。 Input 对象都有键值,但它们是您在布局中设置的字符串。

如果您没有为选项键和选项 k 指定值,将为 Input 元素或某些其他元素生成默认键。

这里为你代码更新了一些语句

today = date.today()
now = today.strftime("%m/%d/%y")                                                # date is the libray name


    # In layout
    [sg.Text('Date', size=(15,1)), sg.InputText(now, key='Date')],             # Define the key
    [sg.Text('Attached Tag', size=(15,1)), sg.InputText(key='Attached Tag')],
    [sg.Text('Entry By', size=(15,1)), sg.InputText(bkey, key='Entry By')],     # Define the key

# Tuple for the input elements not to clear
not_to_clear = ('Entry By', 'Date')

def clear_input():
    # For elements in the window
    for key, element in window.key_dict.items():
        # If element is Input element and not in the not-to-clear tuple
        if isinstance(element, sg.Input) and key not in not_to_clear:
            element.update('')