PysimpleGUI Calc неправильно использует функцию

#python-3.x #calculator #pysimplegui

Вопрос:

Эй, все действительно чешут голову, пытаясь понять, что не так с моим кодом, он не возвращает никаких ошибок, он просто, кажется, пропускает вычислительную часть и печатает сообщение об ошибке, которое я включил, чтобы указать на неправильный ввод пользователя, даже если мои пользовательские вводы действительны.

Я попытался переместить операторы if и определения переменных, чтобы посмотреть, сработает ли это.

Я знаю, что переменные определены сначала над функцией calculate и снова в функции, причина, по которой у меня это так, заключается в том, что в противном случае я получил бы ошибку, что они не были определены, если бы они не были первыми выше всего остального.

 
#Weight Converter Calculator with GUI

import PySimpleGUI as sg

def h():
    h = height
def g():
    g = diameter
    if g == 9:
        diameter = .7
    if g == 11:
        diameter == .4
    if g == 11.5:
        diameter = .38    
def u():
    u = typeunit
    if u == ft:
        typeunit = 1
    if u == rl:
        typeunit = 50
    if u == pl:
        typeunit = 450    
def a():
    a = amount

def calc_weight(h, g, u, a):
    try:
        h, g, u, a = float(h), float(g), float(u), float(a)
        h = height
        a = amount
        g = diameter
        u = typeunit
        if g == 9:
            g = .7
        if g == 11:
            g = .4
        if g == 11.5:
            g = .38
        if u == 'ft':
            u = 1
        if u == 'rl':
            u = 50
        if u == 'pl':
            u = 450
        weight = h * g * u * a
        if weight >= 47001:
            standard = 'too heavy for a truck! '
        elif weight <= 47000:
            standard = 'will fit onto a truck! '
    except (ValueError, ZeroDivisionError):
        return None
    else:
        return f'Weight: {weight}, {standard}'

layout = [
    
    [sg.Text('Please enter your desired Mesh Height, Gauge, Unit, Amount')],
    [sg.Text('Mesh Height in FT', size =(15, 1)), sg.Input(key = h)],
    [sg.Text('Gauge 9, 11, 11.5', size =(15, 1)), sg.Input(key = g)],
    [sg.Text('Unit "ft" for sq ft, "rl" for roll, and "pl" for pallet', size =(15, 3)), sg.Input(key = u)],
    [sg.Text('Amount', size =(15, 1)), sg.Input(key = a)],
    [sg.Text('', key='weight', size=(20, 2))],
    [sg.Submit(), sg.Cancel()]
]
 
window = sg.Window('Chain Link Weight Calculator', layout)
sg.theme('DarkAmber') 
while True:
    event, value = window.Read()
    if event == 'Submit':
        weight = calc_weight(value[h], value[g], value[u], value[a],)
        if weight:
            window.Element('weight').Update(weight, text_color='white')
        else:
            window.Element('weight').Update('Input is incorrect! ', text_color='red')
    elif event == 'Cancel':
        break
    
window.Close()
 

Комментарии:

1. Работает ли ваша calc_weight функция автономно? Под этим я подразумеваю, что при наличии набора допустимых входных данных для функции, дает ли она желаемый результат?

2. Поскольку в оригинале calc_weight используется value[] ключ от simplegui, как бы я мог протестировать только эту функцию самостоятельно с помощью пользовательских вводов? И вы, вероятно, правы, это, скорее всего, проблема с фактической функцией @itprorh66 :p

3. Я бы начал с простого тестирования функции отдельно и дал ей ряд допустимых входных значений, а также некоторые недопустимые значения, чтобы убедиться, что функция вычисляется правильно. Если функция работает правильно, вы можете сосредоточиться на функции value [], чтобы убедиться, что она дает вам то, что вы хотите.

Ответ №1:

Похоже, есть некоторые проблемы

  • Использование имени функции в качестве ключа элемента, например h , g , u и a и эти функции бесполезны
  • Переменные height , amount , diameter и typeunit не определены в функции calc_weight
  • Переменные h , g , u , a сбрасываются в функции calc_weight

Просто демонстрационный скрипт здесь,

 import PySimpleGUI as sg

def find_true(sequence):
    return sequence.index(True)

def calc_weight(values):
    try:
        h, a = float(values['h']), float(values['a'])
        index1 = find_true([values[key] for key in ('G1', 'G2', 'G3')])
        index2 = find_true([values[key] for key in ('U1', 'U2', 'U3')])
        g, u = guages[index1], units[index2]
        weight = h*g*u*a
        standard = 'too heavy for a truck!' if weight>= 47001 else 'will fit onto a truck!'
        result = f'Weight: {weight}, {standard}'
    except:
        result = None
    return result

guages = [0.7, 0.4, 0.38]
units  = [1, 50, 450]

sg.theme('DarkAmber')

layout = [
    [sg.Text('Please enter your desired Mesh Height, Gauge, Unit, Amount')],
    [sg.Text('Mesh Height in FT', size =(15, 1)), sg.Input(key='h')],
    [sg.Text('Gauge', size=(15, 1)),
     sg.Radio("9", 'Guage', size=(8, 1), key='G1', default=True),
     sg.Radio("11", 'Guage', size=(8, 1), key='G2'),
     sg.Radio("11.5", 'Guage', size=(8, 1), key='G3'),],
    [sg.Text('Unit', size=(15, 1)),
     sg.Radio("sq ft", 'Unit', size=(8, 1), key='U1', default=True),
     sg.Radio("roll", 'Unit', size=(8, 1), key='U2'),
     sg.Radio("pallet", 'Unit', size=(8, 1), key='U3'),],
    [sg.Text('Amount', size =(15, 1)), sg.Input(key='a')],
    [sg.Text('', key='weight', size=(45, 2))],
    [sg.Submit(), sg.Cancel()]
]

window = sg.Window('Chain Link Weight Calculator', layout)

while True:

    event, values = window.Read()

    if event in (sg.WINDOW_CLOSED, 'Cancel'):
        break
    elif event == 'Submit':
        weight = calc_weight(values)
        if weight:
            window['weight'].update(weight, text_color='white')
        else:
            window['weight'].update('Input is incorrect!', text_color='white')

window.Close()
 

введите описание изображения здесь

Комментарии:

1. Большое вам спасибо, это потрясающе! Я изменил значения датчиков, чтобы точно рассчитать их вес

2. Если я правильно понимаю, вы присвоили значения датчика и единицы измерения индексу и (вызвали)? они используют радио? Еще раз спасибо вам за ваше время и помощь!

3. Просто решите, какое значение будет, если какое sg.Radio выбрано. Конечно, вы также можете использовать sg.Listbox для указанных меток/значений.