如何在事件中更新输入元素以显示新值集?PySimpleGui

-1 投票
1 回答
42 浏览
提问于 2025-04-14 17:31

我有一个应用程序,可以进行单位转换(比如厘米转英寸等等)。我希望这个应用程序能增加一个功能,就是可以改变它转换的单位。目前,它只转换某些长度单位,但我想让它也能转换质量单位。我尝试通过设置一个变量来实现这一点,这个变量存储特定的单位列表(mass_units = [...]),然后当用户切换单位时,这个变量就会变成另一组单位。

代码:

import PySimpleGUI as sg
from convert import * #file for handling all conversions between units
    
output_value = 0 #output on 2nd input element
main_units = ["Length", "Mass"]#units for elements on 2nd row

length_units = ["Centimeter","Inch","Meter","Kilometer","Feet","Mile"]#units for length
mass_units = ["Gram", "Kilogram", "Pound", "Ounce", "Ton"] #units for mass

selected_unit = length_units

#create layout, giving each element a unique key
layout = [
    [sg.Text("CONVERTER APP")],
    [sg.Spin(main_units, key="main-units",enable_events=True)], #main units element
                                    
    [sg.Input(key="input", enable_events=True),sg.Spin(selected_unit, key="select-unit-1"),#3rd row(Divided in 2 to avoid overflow), first input and select unit element
    sg.Text("="),sg.Input(output_value, key="output", enable_events=True),sg.Spin(selected_unit, key="select-unit-2")], #second input and select unit element

    [sg.Button("Convert", key="convert-button")] #button element, convert first unit to value of second element
]

window = sg.Window("Converter App", layout) #initialize window

while True:
    event, values = window.read()

    if event == sg.WIN_CLOSED:
        break
    if event == 'covert-button' or 'input': #output converts values based on input
        try:
            input_value = float(values['input'])
            
            if values['select-unit-1'] == values['select-unit-2']:
                output_value = values['input']
                window['output'].update(values['input'])
            else:
                output_value = convert_lengths(values['input'], values['select-unit-1'], values['select-unit-2'])
                window['output'].update(output_value)
                print(values['input'], values['output'])
            
            if event == 'main-units':
                selected_unit = mass_units
                window.Element('select-unit-1').update(values=[selected_unit])

        #So app doesnt crash on value errors
        except ValueError:
            window['output'].update(0)
            print("Value Error")
                        
window.close()

1 个回答

0

当主单位发生事件时,更新相关的元素。

示例代码

import PySimpleGUI as sg

table = {
    "Length": {
        "Centimeter": 1.0,
        "Inch": 2.54,
        "Meter": 100,
        "Kilometer": 100000.0,
        "Foot": 30.48,
        "Mile": 160934.4,
    },
    "Mass": {
        "Gram": 1.0,
        "Kilogram": 1000.0,
        "Pound": 453.59237,
        "Ounce": 28.349523125,
        "Ton": 1000000.0,
    }
}

kinds = sorted(list(table.keys()))
kind = kinds[0]
units = sorted(list(table[kind].keys()))

sg.theme("DarkBlue")
sg.set_options(font=("Courier New", 20))

left = [
    [sg.Input("0", size=10, expand_x=True, enable_events=True, key="IN 1")],
    [sg.Listbox(units, default_values=units[0], size=(15, 5), key="UNIT 1")],
]
right = [
    [sg.Input("0", size=10, expand_x=True, enable_events=True, key="IN 2")],
    [sg.Listbox(units, default_values=units[0], size=(15, 5), key="UNIT 2")],
]
layout = [
    [sg.Text("CONVERTER APP", justification='center', expand_x=True)],
    [sg.Push(),
     sg.Spin(kinds, initial_value=kind, size=(15, 1), enable_events=True, key="KIND"),
     sg.Push()],
    [sg.Column(left, pad=(0, 0)),
     sg.Text("=", expand_y=True),
     sg.Column(right, pad=(0, 0))],
    [sg.Button("Convert", expand_x=True)],
]

window = sg.Window("Converter App", layout)

while True:

    event, values = window.read()

    if event == sg.WIN_CLOSED:
        break
    elif event == "KIND":
        kind = values[event]
        units = sorted(list(table[kind].keys()))
        window["IN 1"].update("0")
        window["IN 2"].update("0")
        window["UNIT 1"].update(units, set_to_index=0)
        window["UNIT 2"].update(units, set_to_index=0)

window.close()

在这里输入图片描述 在这里输入图片描述

撰写回答