#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 :p3. Я бы начал с простого тестирования функции отдельно и дал ей ряд допустимых входных значений, а также некоторые недопустимые значения, чтобы убедиться, что функция вычисляется правильно. Если функция работает правильно, вы можете сосредоточиться на функции 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
для указанных меток/значений.