如何防止 PySimpleGUI 看到 "SaveAs" 按钮被视为 "key="

How to keep PySimpleGUI from seeing "SaveAs" button from being treated like a "key="

为了好玩,我做了一个小条形码制作 GUI 项目,当“清除”功能发生时,它会删除“另存为”按钮中的文本。所有其他按钮都没有问题,我试图避免为每个要清除的键放置一行代码。在将代码粘贴到此处之前,我对代码做了一些小改动,因此我知道 if len(values['Area']) > 0: window.perform_long_operation(lambda: get_barcode(),'Saved Pop') 需要更新到现在为止,这始终是正确的。我忘记了当我添加组合框并设置默认值时,这是真的。另外,如果有人能告诉我为什么我没有传递参数但我必须在上面加上“lambda”?

更新 10:45 CT - 我编译了程序并且程序根本没有保存 correctly/not。如果我输入像“test1”这样的名称,它应该在我指定的位置保存为 test1.pdf。当我转到该文件不存在的位置时,但如果我搜索 C 驱动器,它就会显示出来,但几乎无法找到它,就好像它在创建时就被删除了一样。只有在我编译程序时才会出现这种情况。

import PySimpleGUI as sg
import string
pixel_size = [64,128,192,256]

tab1_layout =  [
    [sg.Text('Area Letter:', size=(28,1)), sg.Combo(list(string.ascii_uppercase[:]), default_value= 'A',key='Area')],
    [sg.Text('Start Number Range:', size=(28,1)), sg.InputText(key='start_number')],
    [sg.Text('End Number Range:', size=(28,1)), sg.InputText(key='end_number')],    
]
tab2_layout = [
    [sg.Text('Single Barcode ABC123:', size=(28,1)), sg.InputText(key='single_bc')],
    [sg.Text('Number of Single Barcode Replicas:', size=(28,1)), sg.InputText(default_text= 1,key='number_of_barcodes')],
  
]
layout = [
    [sg.Text('Barcode Font Size in Pixels'), sg.Combo(pixel_size, default_value=64, s=(15,22), enable_events=True, readonly=True, key='PIXEL')],
    [sg.TabGroup([[sg.Tab('Range of Barcodes', tab1_layout), sg.Tab('Single Barcodes', tab2_layout)]])],
    [[sg.Input(key = 'input_loc'), sg.SaveAs(target= 'input_loc' , default_extension= '.pdf')]],
    [sg.Submit(),sg.Button('Clear'), sg.Exit(),]  
]              
def get_barcode():
    print('get barcode')

window = sg.Window('Barcode Maker', layout, font=("Helvetica", 12))

def clear_input():
    for key in values:
        window[key]('')
        window['Area']('A')
        window['PIXEL'](64)
        window['number_of_barcodes'](1)
    return None
while True:
    event, values = window.read(timeout = 10)
    
    if event == sg.WIN_CLOSED or event == 'Exit':
        break
    if event == 'Clear':
        clear_input()
    if event == 'Submit':
        save_location = values['input_loc']
        if len(values['Area']) > 0:
            window.perform_long_operation(lambda: get_barcode(),'Saved Pop')
        elif len(values['single_bc']) >=1:
            bc_size = values['PIXEL']
            single_code = values['single_bc'].upper()
            replicas = values['number_of_barcodes']
            replicas = int(replicas)
            start_rep = 0    
            while start_rep < replicas:
                layout_borb1.add(Barcode(data=single_code, type=BarcodeType.CODE_128, width=Decimal(bc_size), height=Decimal(bc_size),))
                with open(save_location, 'wb') as pdf_file_handle:
                    PDF.dumps(pdf_file_handle, doucment)
                start_rep +=1
        clear_input()```

您函数中的以下代码 clear_input 清除具有 values 中的键的所有元素的值。

    for key in values:
        window[key]('')

values中元素的key不仅有InputCombo个元素,还有TabTabGroupButton个元素。

>>> values
{'PIXEL': 64, 'Area': 'A', 'start_number': '', 'end_number': '', 'single_bc': '', 'number_of_barcodes': '1', 0: 'Range of Barcodes', 'input_loc': '', 'Save As...': ''}

values中的键包括按钮Save As...的键,所以这个按钮的文字也被清除了。

应该有一个规则来指定要清除哪些元素,例如

    for key, element in window.key_dict.items():
        if isinstance(element, (sg.Input, sg.Combo)):
            element.update(value='')

使用lambda定义一个不带参数的函数和函数名几乎一样

window.perform_long_operation(get_barcode,'Saved Pop')

如果可能,将您的代码减少到仅包含相关问题和可执行代码,例如

import PySimpleGUI as sg
import string

pixel_size = [64,128,192,256]

tab1_layout =  [
    [sg.Text('Area Letter:', size=(28,1)), sg.Combo(list(string.ascii_uppercase[:]), default_value= 'A',key='Area')],
    [sg.Text('Start Number Range:', size=(28,1)), sg.InputText(key='start_number')],
    [sg.Text('End Number Range:', size=(28,1)), sg.InputText(key='end_number')],
]
tab2_layout = [
    [sg.Text('Single Barcode ABC123:', size=(28,1)), sg.InputText(key='single_bc')],
    [sg.Text('Number of Single Barcode Replicas:', size=(28,1)), sg.InputText(default_text= 1,key='number_of_barcodes')],

]
layout = [
    [sg.Text('Barcode Font Size in Pixels'), sg.Combo(pixel_size, default_value=64, s=(15,22), enable_events=True, readonly=True, key='PIXEL')],
    [sg.TabGroup([[sg.Tab('Range of Barcodes', tab1_layout), sg.Tab('Single Barcodes', tab2_layout)]])],
    [[sg.Input(key = 'input_loc'), sg.SaveAs(target= 'input_loc' , default_extension= '.pdf')]],
    [sg.Submit(),sg.Button('Clear'), sg.Exit(),]
]
def get_barcode():
    print("get bar_code function called")

window = sg.Window('Barcode Maker', layout, font=("Helvetica", 12))

def clear_input():
    for key, element in window.key_dict.items():
        if isinstance(element, (sg.Input, sg.Combo)):
            element.update(value='')
    window['Area']('A')
    window['PIXEL'](64)
    window['number_of_barcodes'](1)
    return

while True:

    event, values = window.read()

    if event == sg.WIN_CLOSED or event == 'Exit':
        break
    if event == 'Clear':
        clear_input()
    elif event == 'Submit':
        save_location = values['input_loc']
        if len(values['Area']) > 0:
            window.perform_long_operation(get_barcode,'Saved Pop')
        clear_input()
    elif event == 'Saved Pop':
        print("get_barcode complete")

window.close()

对于某些条件,例如 element.taget==(None, None)element.Key is not None,“选择器”按钮将保存从 window.read() 返回的字典 values 中的选择信息。

“选择器”按钮具有以下任何一项 button_type:

  • BUTTON_TYPE_COLOR_CHOOSER
  • BUTTON_TYPE_SAVEAS_FILE
  • BUTTON_TYPE_BROWSE_FILE
  • BUTTON_TYPE_BROWSE_FILES
  • BUTTON_TYPE_BROWSE_FOLDER
  • BUTTON_TYPE_CALENDAR_CHOOSER

函数 SaveAs 定义为带有 file_types=FILE_TYPES_ALL_FILES 的 Button 元素。