Господа, приветствую! Решил описать результаты изучения абсолютно бесплатных курсов и статей по языку программирования python, любые комментарии с одобрениями/осуждениями/пожеланиями приветствуются.
Итак, дело было вечером - делать было нечего.... Бесплатный (пробный) курс на Я.Практикуме подтолкнул зафиксировать полученные знания хоть как-нибудь, так родилась идея создания Калькулятора Лазерной Резки (далее КЛР), аплодисменты в студию!! Видео на ютубе "Учим python за 7 часов! Уроки Python Полный курс обучения программированию на python с нуля" канала Python Hub Studio придало уверенность.
Вот что получилось по коду:
while True:
length = int(input('Длинна мм = ')) # в миллиметрах длинна
width = int(input('Ширина мм = ')) # в миллиметрах ширина
t = int(input('Толщина мм = ')) # в миллиметрах толщина
number_of_pieces = int(input('Кол-во деталей шт = ')) # кол-во деталей шт
rezka = int(input('Длинна резки м/п = ')) # в метрах резка длинна
vstavki = int(input('Кол-во вставок шт = ')) # кол-во вставок при резке
gibov = int(input('Кол-во гибов шт = ')) # кол-во шт гибов
metal_square= (length* width *0.000001)*number_of_pieces
print(f'Площадь металла:{metal_square} м^2')
metal_massa= length * width * t * number_of_pieces * 0.0000078
print(f'Масса маталла: {metal_massa} кг')
metal_money = metal_massa * 350
print(f'Стоимость металла: {int(metal_money)} рублей')
t_list=[ 1, 2, 3, 4, 5, 6, 8, 10, 12, 14, 16, 20]
price_list_100=[27, 36, 57, 64, 76, 87, 111, 154, 191, 224, 360, 519]
price_list_101=[20, 28, 43, 50, 58, 68, 84, 125, 144, 186, 298, 432]
for i in range(len(t_list)):
if t == t_list[i] and rezka <= 100:
rezka_price= price_list_100[i]
elif t == t_list[i] and rezka >100:
rezka_price= price_list_101[i]
rezka_money = rezka * rezka_price
if rezka_money < 5000:
rezka_money = 5000
print(f'Стоимость лазерной резки: {rezka_money} рублей')
vstavki_money = vstavki * 10
print(f'Стоимость вставок: {vstavki_money} рублей')
if gibov <20:
gibov_price = 200
else:
gibov_price = 100
gibov_money = gibov * gibov_price
print(f'Стоимость гибки: {gibov_money} рублей')
print(f'ЕСЛИ МЕТАЛЛ НАШ: {metal_money + rezka_money + vstavki_money + gibov_money}')
print(f'ЕСЛИ МЕТАЛЛ СВОЙ: {rezka_money + vstavki_money + gibov_money}')
Вот что получилось по выводу:
Заказы на нашем производстве стали просчитываться в 3 раза быстрее!! но пересмотрев курс на ютубе и на Я.Практикуме, пришло понимание что надо осваивать функции и похоже что мой КЛР ждет v2.0
На этот раз вот что получилось по коду:
t_list=[ 1, 2, 3, 4, 5, 6, 8, 10, 12, 14, 16, 20]
price_list_100=[27, 36, 57, 64, 76, 87, 111, 154, 191, 224, 360, 519]
price_list_101=[20, 28, 43, 50, 58, 68, 84, 125, 144, 186, 298, 432]
def metal_params():
global metal_cost
length = int(input('Длинна мм = '))
width = int(input('Ширина мм = '))
global t
t = int(input('Толщина мм = '))
number_of_pieces = int(input('Кол-во деталей шт = '))
global metal_cost
metal_cost = length * width * t * number_of_pieces * 0.0000078 * 350
return f'Площадь металла: {(length* width *0.000001)*number_of_pieces} м^2 \nМасса маталла:{length * width * t * number_of_pieces * 0.0000078} кг \nСтоимость металла:{metal_cost} рублей'
def cutting_cost():
cutting_length = int(input('Длинна резки м/п = '))
for i in range(len(t_list)):
if t == t_list[i] and cutting_length <= 100:
cutting_price= price_list_100[i]
elif t == t_list[i] and cutting_length >100:
cutting_price= price_list_101[i]
global cutting_money
cutting_money = cutting_length * cutting_price
if cutting_money < 5000:
cutting_money = 5000
return f'Стоимость лазерной резки: {cutting_money} рублей'
def insert_cost():
global insert_money
insert_money = int(input('Кол-во вставок шт = ')) * 10
return f'Стоимость вставок: {insert_money} рублей'
def bending_cost():
bending_count = int(input('Кол-во гибов шт = '))
if bending_count <20:
bending_price = 200
else:
bending_price = 100
global bending_money
bending_money = bending_count * bending_price
return f'Стоимость гибки: {bending_money} рублей'
def cost_out():
metal = metal_params()
cutting = cutting_cost()
insert = insert_cost()
bending = bending_cost()
print (f'{metal}\n{cutting}\n{insert}\n{bending}')
print (f'Если металл наш:{metal_cost + cutting_money + insert_money + bending_money} \nЕсли метал НЕ наш: {cutting_money + insert_money + bending_money}')
while True:
cost_out()
Вывод результатов остался таким же. Да, согласен - ничего не поменялось, но сие творение получило возможность неограниченного расширения функционала, например оценка стоимости сварного шва, резки не только лазером (болгарка, ленточный станок), покраски, доставки и т.д. Мыслей было много, программа работала и использовалась почти каждый день.
Постепенно образовалась проблема следующего характера - никто не мог пользоваться этой программой, кроме меня. И заморачиваться установкой Python-а на комп ради одного калькулятора - так себе затея. Было решено - калькулятор в массы!! В этом оч помог краткий курс от https://python-scripts.com/ и тот же курс с канала Python Hub Studio прекрасно дополнил это дело по библиотекам TKINTER + pyinstaller, которые могут сделать из простого кода полноценное, самостоятельное приложение с расширением .exe! То есть, да, оно работает на любом компьютере как обыная прога.
Вот так пришло время КЛР V 3.0, код стал таким:
import tkinter as tk
# вводные данные из таблицы по стоимости лазерной резки
t_list = [1, 2, 3, 4, 5, 6, 8, 10, 12, 14, 16, 20]
price_list_100 = [27, 36, 57, 64, 76, 87, 111, 154, 191, 224, 360, 519]
price_list_101 = [20, 28, 43, 50, 58, 68, 84, 125, 144, 186, 298, 432]
# функция по просчету площади, массы, стоимости металла
def metal_params():
metal_square = (int(ent_length.get()) * int(ent_width.get())
* 0.000001) * int(ent_number_of_pieces.get())
lbl_metal_square["text"] = f"Площадь металла: {metal_square} m^2"
metal_massa = int(ent_length.get()) * int(ent_width.get()) * \
int(ent_t.get()) * int(ent_number_of_pieces.get()) * 0.0000078
lbl_metal_massa["text"] = f"Масса маталла: {metal_massa} кг"
global metal_money
metal_money = metal_massa * 100
lbl_metal_money["text"] = f'Стоимость металла: {int(metal_money)} рублей'
# функция по просчету стоимости резки
def cutting_cost():
cutting_length = int(ent_rezka.get())
for i in range(len(t_list)):
if int(ent_t.get()) == t_list[i] and cutting_length <= 100:
cutting_price = price_list_100[i]
elif int(ent_t.get()) == t_list[i] and cutting_length > 100:
cutting_price = price_list_101[i]
global cutting_money
cutting_money = cutting_length * cutting_price
if cutting_money < 5000:
cutting_money = 5000
lbl_cutting_money["text"] = f'Стоимость лазерной резки: {cutting_money} рублей'
# функция по просчету стоимости вставок
def insert_cost():
global insert_money
insert_money = int(ent_vstavki.get()) * 5
lbl_insert_money["text"] = f'Стоимость вставок: {insert_money} рублей'
# функция по просчету стоимости гибки
def bending_cost():
bending_count = int(ent_gibov.get())
if bending_count < 20:
bending_price = 200
else:
bending_price = 100
global bending_money
bending_money = bending_count * bending_price
lbl_bending_money["text"] = f'Стоимость гибки: {bending_money} рублей'
# функция вызывает другие функции и считает итоговую стоимость, это команда для кнопки в приложении
def cost_out():
metal_params()
cutting_cost()
insert_cost()
bending_cost()
lbl_out_cost["text"] = f'Если металл наш: {metal_money + cutting_money + insert_money + bending_money}'
lbl_out_cost2["text"] = f'Если метал НЕ наш: {cutting_money + insert_money + bending_money}'
# создали окно и название окна
window = tk.Tk()
window.title('Калькулятор заказов в мастерской')
window.resizable(width=False, height=False)
# создали рамку frm_data в которой разместили ярлыки и поля ввода
frm_data = tk.Frame(master=window)
lbl_length = tk.Label(master=frm_data, text='Длинна мм = ')
lbl_width = tk.Label(master=frm_data, text='Ширина мм = ')
lbl_t = tk.Label(master=frm_data, text='Толщина мм = ')
lbl_number_of_pieces = tk.Label(master=frm_data, text='Кол-во деталей шт = ')
lbl_rezka = tk.Label(master=frm_data, text='Длинна резки м/п = ')
lbl_vstavki = tk.Label(master=frm_data, text='Кол-во вставок шт = ')
lbl_gibov = tk.Label(master=frm_data, text='Кол-во гибов шт = ')
# поля ввода для каждого ярлыка
ent_length = tk.Entry(master=frm_data, width=10)
ent_width = tk.Entry(master=frm_data, width=10)
ent_t = tk.Entry(master=frm_data, width=10)
ent_number_of_pieces = tk.Entry(master=frm_data, width=10)
ent_rezka = tk.Entry(master=frm_data, width=10)
ent_vstavki = tk.Entry(master=frm_data, width=10)
ent_gibov = tk.Entry(master=frm_data, width=10)
# указываем положение ярлыков в рамке
lbl_length.grid(row=0, column=0, sticky="e")
lbl_width.grid(row=1, column=0, sticky="e")
lbl_t.grid(row=2, column=0, sticky="e")
lbl_number_of_pieces.grid(row=3, column=0, sticky="e")
lbl_rezka.grid(row=4, column=0, sticky="e")
lbl_vstavki.grid(row=5, column=0, sticky="e")
lbl_gibov.grid(row=6, column=0, sticky="e")
# указываем положение полей ввода в рамке
ent_length.grid(row=0, column=1, sticky="w")
ent_width.grid(row=1, column=1, sticky="w")
ent_t.grid(row=2, column=1, sticky="w")
ent_number_of_pieces.grid(row=3, column=1, sticky="w")
ent_rezka.grid(row=4, column=1, sticky="w")
ent_vstavki.grid(row=5, column=1, sticky="w")
ent_gibov.grid(row=6, column=1, sticky="w")
# обьявляем кнопку
btn_go = tk.Button(master=window, text='Посчитать', command=cost_out)
# рамка с результатами вычислений
frm_result = tk.Frame(master=window, width=1000)
# ярлыки в которых результаты вычислений
lbl_metal_square = tk.Label(master=frm_result, text='Площадь металла: ')
lbl_metal_massa = tk.Label(master=frm_result, text='Масса маталла: ')
lbl_metal_money = tk.Label(master=frm_result, text='Стоимость металла: ')
lbl_cutting_money = tk.Label(
master=frm_result, text='Стоимость лазерной резки: ')
lbl_insert_money = tk.Label(master=frm_result, text='Стоимость вставок: ')
lbl_bending_money = tk.Label(master=frm_result, text='Стоимость гибки: ')
lbl_out_cost = tk.Label(master=frm_result, text='Если металл наш: ')
lbl_out_cost2 = tk.Label(master=frm_result, text='Если металл НЕ наш: ')
# указываем положение результатов в рамке результатов
lbl_metal_square.grid(row=0, column=0)
lbl_metal_massa.grid(row=1, column=0)
lbl_metal_money.grid(row=2, column=0)
lbl_cutting_money.grid(row=3, column=0)
lbl_insert_money.grid(row=4, column=0)
lbl_bending_money.grid(row=5, column=0)
lbl_out_cost.grid(row=6, column=0)
lbl_out_cost2.grid(row=7, column=0)
# указываем положение рамки и кнопки в общем окне
frm_data.grid(row=0, column=0, padx=10)
btn_go.grid(row=0, column=1, padx=10)
frm_result.grid(row=0, column=2, padx=10)
# шоб все заработало
window.mainloop()
ввод и вывод стал выглядеть так:
Сейчас учу тему по ООП, хз делать V 4.0 или что то более масштабное сообразить?... Кто дочитал до конца - красавчик.
Респект автору канала Python Hub Studio, Я.Практикуму и всем кто выкладывает образовательные материалы по программированию. Земной поклон вам, сделаю вам скидку при просчете заказа :-)
Комментарии (33)
longclaps
00.00.0000 00:00+3t_list=[ 1, 2, 3, 4, 5, 6, 8, 10, 12, 14, 16, 20] price_list_100=[27, 36, 57, 64, 76, 87, 111, 154, 191, 224, 360, 519] price_list_101=[20, 28, 43, 50, 58, 68, 84, 125, 144, 186, 298, 432] for i in range(len(t_list)): if t == t_list[i] and rezka <= 100: rezka_price= price_list_100[i] elif t == t_list[i] and rezka >100: rezka_price= price_list_101[i]
аплодисменты в студию!!
Надо бы вам разузнать о словарях, а то как-то неловко получается.
Я.Практикум, зачем так халтурите?
avshkol
00.00.0000 00:00Для того, чтобы этот код стал питоновским, заменить: for i in range(len(t_list)):
на
for i, t_list_item in enumerate(t_list):
И вынести константы:
REZKA_LIMIT = 100
CUTTING_LIMIT = 5000
HemulGM
00.00.0000 00:00+10Вот твоя "программа" на Делфи, которую я написал за 10 минут и в 60 строк кода
var Form4: TForm4; t_list: TArray<Integer> = [1, 2, 3, 4, 5, 6, 8, 10, 12, 14, 16, 20]; price_list_100: TArray<Integer> = [27, 36, 57, 64, 76, 87, 111, 154, 191, 224, 360, 519]; price_list_101: TArray<Integer> = [20, 28, 43, 50, 58, 68, 84, 125, 144, 186, 298, 432]; implementation {$R *.fmx} procedure TForm4.metal_params; begin var metal_square :=(StrToFloat(ent_length.Text) * StrToFloat(ent_width.Text) * 0.000001) * StrToFloat(ent_number_of_pieces.Text); lbl_metal_square.Text := 'Площадь металла: ' + FloatToStr(metal_square) + ' m^2'; var metal_massa := StrToFloat(ent_length.Text) * StrToFloat(ent_width.Text) * StrToFloat(ent_t.Text) * StrToFloat(ent_number_of_pieces.Text) * 0.0000078; lbl_metal_massa.Text := 'Масса металла: ' + FloatToStr(metal_massa) + ' кг'; metal_money := metal_massa * 100; lbl_metal_money.Text := 'Стоимость металла: ' + CurrToStr(Round(metal_money)) + ' рублей'; end; procedure TForm4.cutting_cost; begin var cutting_price := 0; var cutting_length := StrToFloat(ent_rezka.Text); for var i := 0 to Length(t_list) - 1 do if (StrToInt(ent_t.Text) = t_list[i]) and (cutting_length <= 100) then cutting_price := price_list_100[i] else if (StrToInt(ent_t.Text) = t_list[i]) and (cutting_length > 100) then cutting_price := price_list_101[i]; cutting_money := cutting_length * cutting_price; if cutting_money < 5000 then cutting_money := 5000; lbl_cutting_money.Text := 'Стоимость лазерной резки: ' + CurrToStr(cutting_money) + ' рублей'; end; procedure TForm4.insert_cost; begin insert_money := StrToFloat(ent_vstavki.Text) * 5; lbl_insert_money.Text := 'Стоимость вставок: ' + CurrToStr(insert_money) + ' рублей'; end; procedure TForm4.bending_cost; begin var bending_price := 0.0; var bending_count := StrToFloat(ent_gibov.Text); if bending_count < 20 then bending_price := 200 else bending_price := 100; bending_money := bending_count * bending_price; lbl_bending_money.Text := 'Стоимость гибки: ' + CurrToStr(bending_money) + ' рублей'; end; procedure TForm4.cost_out; begin metal_params(); cutting_cost(); insert_cost(); bending_cost(); lbl_out_cost.Text := 'Если металл наш: ' + IntToStr(Round(metal_money + cutting_money + insert_money + bending_money)); lbl_out_cost2.Text := 'Если метал НЕ наш: ' + IntToStr(Round(cutting_money + insert_money + bending_money)); end; procedure TForm4.btn_goClick(Sender: TObject); begin cost_out; end;
Плюс, она не требует зависимостей и прям сейчас могу нажать кнопу и собрать её под Андроид, иОС, мак или линукс. Более я не писал ни строчки
Bigata
00.00.0000 00:00Брависсимо! Жаль не могу лайк поставить
HemulGM
00.00.0000 00:00+1После небольшого кол-ва кликов мышкой, мы получаем вот такое
А ну и я ещё немного оптимизировал и улучшил код
function TForm4.GetMetalCost(ALength, AWidth, ADepth, ANoP: Int64; out AMetalSquare, AMetalMassa: Extended): Extended; begin AMetalSquare := (ALength * AWidth * 0.000001) * ANoP; AMetalMassa := ALength * AWidth * ADepth * ANoP * 0.0000078; Result := AMetalMassa * 100; end; function TForm4.GetCuttingCost(ACuttingLength, ANoP: Int64): Int64; begin Result := 0; if FPriceList.ContainsKey(ANoP) then Result := ACuttingLength * FPriceList.Items[ANoP][Ord(ACuttingLength > 100)]; if Result < 5000 then Result := 5000; end; function TForm4.GetInsertCost(AInsertCount: Int64): Int64; begin Result := AInsertCount * 5; end; function TForm4.GetBendingCost(ABendingCount: Int64): Int64; begin Result := IfThen(ABendingCount < 20, ABendingCount * 200, ABendingCount * 100); end; procedure TForm4.ButtonCalcClick(Sender: TObject); begin var ALength := StrToInt64(EditLength.Text); var AWidth := StrToInt64(EditWidth.Text); var ADepth := StrToInt64(EditDepth.Text); var ANoP := StrToInt64(EditNumberOfPieces.Text); var ACuttingLength := StrToInt64(EditCutting.Text); var AInsertCount := StrToInt64(EditInsert.Text); var ABendingCount := StrToInt64(EditBending.Text); var AMetalSquare: Extended; var AMetalMassa: Extended; try var MetalCost := GetMetalCost(ALength, AWidth, ADepth, ANoP, AMetalSquare, AMetalMassa); var CuttingCost := GetCuttingCost(ACuttingLength, ANoP); var InsertCost := GetInsertCost(AInsertCount); var BendingCost := GetBendingCost(ABendingCount); LabelDate.Text := FormatDateTime('dd.mm.yyyy h:NN:ss', Now); lbl_metal_money.Text := Format('%d рублей', [Round(MetalCost)]); lbl_metal_square.Text := Format('%f m^2', [AMetalSquare]); lbl_metal_massa.Text := Format('%f кг', [AMetalMassa]); lbl_cutting_money.Text := Format('%d рублей', [CuttingCost]); lbl_insert_money.Text := Format('%d рублей', [InsertCost]); lbl_bending_money.Text := Format('%d рублей', [BendingCost]); lbl_out_cost.Text := Format('%d р.', [Round(MetalCost + CuttingCost + InsertCost + BendingCost)]); lbl_out_cost2.Text := Format('%d р.', [CuttingCost + InsertCost + BendingCost]); except ShowMessage('Ошибка расчетов'); end; end;
Теперь он устойчив к ошибкам ввода и считает огромные числа
Если нужно, я могу скинуть проект. Для его сборки достаточно поставить бесплатную версию среды Delphi. Открыть проект и нажать кнопку "Play". Сейчас в релизе ехе выходит 8мб
Bigata
00.00.0000 00:00да я к тому, что Вы быстро набросали прогу, хотя сам проверить не могу (не спец в Delphi), но почти уверен что можно запустить после компиляции достаточно легко на ... На винде?
HemulGM
00.00.0000 00:00На чем угодно можно запустить (собрать). Выглядеть будет одинаково. И работать
falconandy
00.00.0000 00:00+1Можно еще для подобных простых утилит использовать Terminal UI — например так примерно будет выглядеть с библиотекой tview для Go:
Размер бинарника будет примерно 3-4мб.
HemulGM
00.00.0000 00:00Ну, если собрать на vcl, а не на fmx, как я. Это ограничит, конечно, виндой, но бинарник будет весь мб 2. Или меньше. Но при этом выглядеть могут примерно так же. Может чуть хуже
erzi
00.00.0000 00:00-1Отлично, но на джаве еще проще, никаких зависимостей, собирать ничего не надо, лишь бы виртуальная машина стояла в системе
HemulGM
00.00.0000 00:00+2А в чем сложность собрать? Кнопку одну нажать только надо) Ладно, две кнопки. Одну чтоб выбрать платформу, вторую, чтоб собрать приложение)
UndefinedRef
00.00.0000 00:00После вашего поста тоже захотел переписать на близкую к душе кроссплатформенную технологию.
Поэтому вот приложение на Avalonia, которое запускается на Windows, Linux, MacOS, Android, IOS и WebAssembler (запускается в браузере)
Исходный код на гитхаб для посмотреть
HemulGM
00.00.0000 00:00Столько кода ради 7 полей и одного вычисления. Собственно я как раз для обратного показывал пример. ВебАсм мы кстати тоже ждём для Делфи. А пока, если надо для веб, то через отдельный фреймворк. Но принцип тот же - меньше лишнего кода. Основное сосредоточение на функциональной части, а не на том как и где отображать
UndefinedRef
00.00.0000 00:00Да там большинство кода это шаблон.Но всё равно кода можно намного меньше было, просто я не стал всё писать в Code-behind в MVVM freandly фреймоворке.
Столько кода, потому что вычисления вынесены в отдельный сервис, а сама приложение разбито на Model, ViewModel и View. Поэтому View такое жирное, т.к. живёт само по себе. И в принципе его без проблем можно оторвать от всего остального и безболезненно переписать.
А сами ViewModel и Model там из нескольких строк состоят (равному количеству полей конечно же). Зато очень всё удобно и масштабируемо и хорошо разделяет ответственность. Конечно в данном конкретном случае это овернженеринг, но например к этому с 1 тычка прикручивается генератор PDF отчётов (с помощью PDF.Quest), т.к. модель отдельно существует.А так, если всю логику поместить во View, напрямую биндиться к эвентам и забирать напрямую значения из контролов, то выйдет примерно столько же.
HemulGM
00.00.0000 00:00У меня, на самом деле, пропущен только Model этап и контроллер не отделен от View model. Но это сделать, если надо можно легко. И так же все масштабировать. В делфи по умолчанию используется MVC/MVVM (там тонкая грань). Просто тогда ещё не было таких понятий, но уже принцип был похожий.
Т.е. у нас код представления отделен от кода контроллера/модели предоставления. Обычно, мы ещё сильнее его отделяем функциональный код в контроллеры, чтоб можно было на одних данных работать с разных представления (форм/фреймов).
Так что с масштабированием проблем тоже нет.
Если нужно для отдельной платформы создать иное представление, то не нужно писать код нового представления, достаточно выбрать режим и подстроить одну модель для конкретной платформы, так же визуально.
Также, есть ещё одно разделение, на равные размеры (актуально, например, для мобильных устройств или часов). Опять же просто выбираем нужный размер (обычно это шаблон некого устройства с его параметрами экрана) и снова можем настроить то же представление.
Помимо всего этого, есть такая штука, как "стили". Что является не просто скиндвижком, а системой, которая позволяет применить вариант отображения для любого отображаемого контрола. Т.е. мы можем создать стиль кнопки, которая содержит внутри себя ещё кнопку или даже текстовое поле и применить этот стиль к кнопке в окне или вообще к любому контроля и он будет отображаться так, как мы сделали стиль. Можем создать стиль, в который поместим прямоугольник, настроим его цвет и другие параметры, настроим анимацию при наведении или нажатии, поместим текст и картинку слева и можем применить этот стиль к чему угодно. Да хоть модем кнопку отражать как таблицу (толку правда от такого мало). И все это опять же без кода. Как видим, так и настраиваем. Все применяется в дизайнтайме (в режиме реального времени).
Ну и это только верхушка айсберга)
Там ещё куча всякого по типу шейдеров, эффектов, 3д, анимации любых свойств по триггерами или без и т.д.
HemulGM
00.00.0000 00:00Или вот ещё, например, смена скина всего содержимого с эффектом. Нашел только ссылку на ВК видео Видео в вк
CadMan77
00.00.0000 00:00Хочу уметь также, но с Делфи опыта нет. Как на VBnet писать приложение с возможностью сборки по Вин и Андроид (если конечно возможно)? FMX это что-то, что позволяет вот это все?
UPDATE:
Вопрос снят.
Нашел - FireMonkey Cross-Platform Framework.
dndred
00.00.0000 00:00+2Сейчас учу тему по ООП, хз делать V 4.0 или что то более масштабное сообразить
Если интересно развиваться дальше как программист, то стоит продолжить улучшать эту программу. Это хороший тренировачный полигон.
ООП штука хорошая, но слишком большая. Советую для начала посмотреть что такое dataclass, а потом, перечитав тему Функции, переделать код ещё раз:
1. Нужно разделить всё на две части - одна исключительно рисует форму и получае данные, а другая считает площадь и стоимость.
2. Взаимодействие между ними должно сводиться к одной строчке: estimate = cost_out(order). 3. Ключеное слово global не использовать.
4. В рассчётной части не должно быть ни одной русской буквы, кроме комментариев.
Changes requested :-)
MostwOnted7
00.00.0000 00:00Я не на что не притендую я начинающий. Но может убрать слово посчитать вовсе? У питона развен нет слушателей? Пока ничего не ввел все в звездочках, и просчитывает калькулятор при вводе данных.
Увеличить шрифт для быстрейшего понимания.
velipre_xella
00.00.0000 00:00Когда-то пытался стать оператором на лазерной резке TCL-3030, а сейчас в айтишке, и зп больше 100. Не думал, что до такого в родном екб доживу. Поставил автору лайк за статью, и+ в карму, - за замах.
rudinandrey
а еще проще можно было бы сделать на веб-странице, и еще проще можно было бы это сделать вообще на статической странице .html на языке JavaScript
тогда можно было бы поднять в локальной сети свой веб-сервер, да хоть через ту же node и все бы заходили кому надо пользовались, а ты мог бы его развивать, и никому не надо было бы переустанавливать программу при каждом обновлении.
Alexufo
Ага, вместо дистрибутивов ставь ноду ,обеспечивай доступность жаваскрипта. Следи за сертификатами. Безопасностью. Совет на 5 баллов)
На codepen код выкладывается и ссылкой шарится.
konst90
Я бы вообще в Excel или Гугл-таблицах сделал. Задачка-то примитивная.
ValeriyPu
А почему не веб сервис с "нарисуйте где резать красной линией толщиной 4"?
konst90
По принципу разумной достаточности. В Экселе эта штука пишется за десять минут при наличии базовых навыков, отредактирует её при необходимости любой офисный работник, и работать оно будет без подъёма сервера.
HerrDirektor
И можно придать расчётам вид любой формы для визуализации/печати, хранить калькуляцию для клиентов и т.п.
kolchasik Автор
да, ты прав! в гугл.табицах это было бы проще и удобней! но как это помогло бы в закреплении знаний в python.....
konst90
Да, здесь надо разделить задачи. Как освоение Питона - пример хороший. Как практически нужная штука - нет, в бизнесе (смотрим заголовок) такие решения скорее вредны чем полезны.
sunnybear
Можно через сниппет кода, закладку в браузере