如何防止 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不仅有Input
、Combo
个元素,还有Tab
、TabGroup
、Button
个元素。
>>> 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 元素。
为了好玩,我做了一个小条形码制作 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不仅有Input
、Combo
个元素,还有Tab
、TabGroup
、Button
个元素。
>>> 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 元素。