如何在Python的PySimpleGUI中实现货币格式输入与显示?
问题解答
1. PySimpleGUI是否适合实现该功能?需要搭配其他脚本吗?
PySimpleGUI完全适合实现这个功能,不需要额外搭配第三方脚本,依靠Python标准库和PySimpleGUI自身的事件处理就能完成需求。
2. 实现代码
以下是修改后的完整代码,实现了仅允许输入数字和实时货币格式显示的功能:
import PySimpleGUI as sg import locale # 设置本地化规则,确保千位分隔符显示正确 locale.setlocale(locale.LC_ALL, '') sg.theme('DarkAmber') # 存储用户输入的纯数字原始内容(去掉格式后的字符串) raw_digits = '' def format_to_currency(value): """将纯数字字符串转换为指定的货币格式""" if not value: return '' # 区分整数和小数情况处理 if '.' in value: integer_part, decimal_part = value.split('.', 1) # 最多保留两位小数 decimal_part = decimal_part[:2] # 格式化整数部分为带千位分隔符的形式 formatted_integer = locale.format_string('%d', int(integer_part), grouping=True) # 根据是否有小数部分返回对应格式 return f'${formatted_integer}.{decimal_part}' if decimal_part else f'${formatted_integer}' else: formatted_integer = locale.format_string('%d', int(value), grouping=True) return f'${formatted_integer}' layout = [ [sg.Text('Some text on Row 1')], [sg.Text('Enter amount'), sg.InputText(key='-CURRENCY_INPUT-', enable_events=True)], [sg.OK(), sg.Cancel()] ] window = sg.Window('Currency Input', layout) while True: event, values = window.read() if event in (sg.WIN_CLOSED, 'Cancel'): break # 监听输入框的实时输入事件 if event == '-CURRENCY_INPUT-': current_input = values['-CURRENCY_INPUT-'] global raw_digits # 过滤输入内容:只保留数字和最多一个小数点 filtered_chars = [] has_decimal = False for char in current_input: if char.isdigit(): filtered_chars.append(char) elif char == '.' and not has_decimal: filtered_chars.append(char) has_decimal = True # 生成新的纯数字字符串 new_raw = ''.join(filtered_chars) # 仅当原始内容变化时更新显示,避免循环触发事件 if new_raw != raw_digits: raw_digits = new_raw # 转换为货币格式后更新输入框内容 formatted_text = format_to_currency(raw_digits) window['-CURRENCY_INPUT-'].update(formatted_text) window.close()
3. 代码核心逻辑说明
- 输入限制:遍历用户输入的每个字符,仅保留数字和最多一个小数点,直接过滤非允许输入的内容。
- 实时格式化:给输入框开启
enable_events=True,每次输入内容变化时触发事件,调用格式化函数将纯数字转为带$符号和千位分隔符的货币格式。 - 格式兼容:使用Python标准库
locale处理千位分隔符,适配不同地区的格式规则;如果需要固定美式格式,也可以手动拼接字符串替代locale的使用。 - 小数控制:自动处理整数和小数两种场景,用户输入小数点时最多保留两位,未输入小数点时显示整数形式(如$20),符合需求示例。
内容的提问来源于stack exchange,提问作者EMAN
相关产品推荐
相关产品推荐

