Home > other >  How to keep PySimpleGUI from seeing "SaveAs" button from being treated like a "key=&q
How to keep PySimpleGUI from seeing "SaveAs" button from being treated like a "key=&q

Time:05-20

I made a little barcode making GUI project for fun and when the "clear" function takes place it deletes the text in the "SaveAs" button. All other buttons have no issues with this and I was trying to avoid putting a line of code for each key to clear. I made some minor changes to the code before pasting it here so I know that the if len(values['Area']) > 0: window.perform_long_operation(lambda: get_barcode(),'Saved Pop') needs to be updated as of now this would always be true. I forgot when I added the combo box and set a default value you this would be true. Also if anyone could tell me why I have to have "lambda" above although I'm not passing a parameter?

Update 10:45 CT - I compiled the program and and the program is not saving correctly/not at all. If I put in a name like "test1" it should be saved as test1.pdf at the location I specified. When I go to the location the file does not exist but if I search the C drive it shows up but it cannot be located almost as if it is deleted the moment it is created. This only happens when I compile the program.

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()```

CodePudding user response:

Following code in your function clear_input clear the value of all the elements which with the key in values.

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

The key of element in values not only Input, Combo elements, also Tab, TabGroup and Button elements.

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

The key in values include the key of button Save As..., that's why the text of this button also cleared.

There should be a rule to specify which elements to be cleared, like

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

Using lambda to define a function without arguments is almost the same as the function name.

window.perform_long_operation(get_barcode,'Saved Pop')

If possible, reduce your code to only with related issues and an executable code, like

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

For some conditions, like element.taget==(None, None) or element.Key is not None, "chooser" Buttons will hold the information of selection in the dictionary values which returned from window.read().

"chooser" Buttons with any one of following 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

Function SaveAs defined as a Button element with file_types=FILE_TYPES_ALL_FILES.

  • Related