You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 14:40:35