Найти в Дзене

Калькулятор заправок PCP-оружия на Python

*** Любители пневматического оружия (винтовок и пистолетов) с предварительной накачкой (англ. Pre Charged Pneumatics, PCP) заправляют его или с помощью насосов высокого давления (НВД), или с помощью компрессоров высокого давления (КВД), или с помощью предварительно заправленного баллона высокого давления (БВД). Встроенный резервуар PCP-винтовки/пистолета заправляется до давления от 200 до 300 бар (в зависимости от марки оружия). Баллоны высокого давления (наиболее часто применяют баллоны ёмкостью от 2 до 7 литров), как правило, "задувают" до давления 300 бар. При выезде на соревнования/"пострелушки" перед стрелком стоит вопрос: на сколько заправок оружия хватит заправленного баллона? Первоначально сделал шаблон для расчёта количества полных заправок в Microsoft Office Excel [по формуле =B2/B3*(B4-B5)/(B5-B6)]: Но потом решил создать программу для расчёта в Python. *** Код программы с графическим интерфейсом для расчёта количества полных заправок резервуара PCP‑винтовки/пистолета: #

***

Любители пневматического оружия (винтовок и пистолетов) с предварительной накачкой (англ. Pre Charged Pneumatics, PCP) заправляют его или с помощью насосов высокого давления (НВД), или с помощью компрессоров высокого давления (КВД), или с помощью предварительно заправленного баллона высокого давления (БВД).

Встроенный резервуар PCP-винтовки/пистолета заправляется до давления от 200 до 300 бар (в зависимости от марки оружия).

Баллоны высокого давления (наиболее часто применяют баллоны ёмкостью от 2 до 7 литров), как правило, "задувают" до давления 300 бар.

При выезде на соревнования/"пострелушки" перед стрелком стоит вопрос: на сколько заправок оружия хватит заправленного баллона?

Первоначально сделал шаблон для расчёта количества полных заправок в Microsoft Office Excel [по формуле =B2/B3*(B4-B5)/(B5-B6)]:

Но потом решил создать программу для расчёта в Python.

***

Код программы с графическим интерфейсом для расчёта количества полных заправок резервуара PCP‑винтовки/пистолета:

# Author: Netler

#

# Copyright: (c) Netler 2021

import tkinter as tk

from tkinter import messagebox

def calculate_refills():

try:

# Получаем значения из полей ввода

V = float(entry_V.get()) # Объём баллона, см³

v = float(entry_v.get()) # Объём резервуара, см³

P = float(entry_P.get()) # Давление в баллоне, бар

P_max = float(entry_P_max.get()) # Макс. давление в резервуаре, бар

P_min = float(entry_P_min.get()) # Мин. (остаточное) давление, бар

# Проверяем корректность значений

if V <= 0 or v <= 0:

messagebox.showerror("Ошибка", "Объёмы должны быть положительными числами!")

return

if P <= 0 or P_max <= 0 or P_min < 0:

messagebox.showerror("Ошибка", "Давление должно быть неотрицательным и положительным там, где это требуется!")

return

if P_max <= P_min:

messagebox.showerror("Ошибка", "P_макс должно быть больше P_мин!")

return

if P <= P_max:

messagebox.showinfo("Результат", "Давление в баллоне недостаточно для заправки резервуара.")

entry_result.delete(0, tk.END)

entry_result.insert(0, "0")

return

# Вычисляем количество заправок по формуле

n = (V / v) * (P - P_max) / (P_max - P_min)

# Округляем вниз до целого (полные заправки)

n_full = int(n)

# Выводим результат

entry_result.delete(0, tk.END)

entry_result.insert(0, str(n_full))

except ValueError:

messagebox.showerror("Ошибка", "Пожалуйста, введите корректные числовые значения!")

except Exception as e:

messagebox.showerror("Ошибка", f"Произошла ошибка: {str(e)}")

def on_close():

root.destroy()

# Создаём главное окно

root = tk.Tk()

root.title("Расчёт заправок PCP-оружия")

root.geometry("700x500")

root.resizable(False, False)

# Заголовок

label_title = tk.Label(root, text="Расчёт количества полных заправок резервуара PCP-винтовки/пистолета из баллона со сжатым воздухом", wraplength=480, justify="center", font=("Arial", 10, "bold"))

label_title.pack(pady=10)

# Поля ввода с подписями

tk.Label(root, text="Объём баллона со сжатым воздухом, V, см³").pack(anchor="w", padx=20)

entry_V = tk.Entry(root, width=40)

entry_V.pack(pady=5, padx=20, fill="x")

tk.Label(root, text="Объём резервуара винтовки/пистолета, v, см³").pack(anchor="w", padx=20)

entry_v = tk.Entry(root, width=40)

entry_v.pack(pady=5, padx=20, fill="x")

tk.Label(root, text="Давление в баллоне со сжатым воздухом до начала заправки, P, бар").pack(anchor="w", padx=20)

entry_P = tk.Entry(root, width=40)

entry_P.pack(pady=5, padx=20, fill="x")

tk.Label(root, text="Максимальное давление, до которого требуется заправить резервуар PCP-винтовки/пистолета, P_макс, бар").pack(anchor="w", padx=20)

entry_P_max = tk.Entry(root, width=40)

entry_P_max.pack(pady=5, padx=20, fill="x")

tk.Label(root, text="Минимальное (остаточное) давление в резервуаре PCP-винтовки/пистолета, P_мин, бар").pack(anchor="w", padx=20)

entry_P_min = tk.Entry(root, width=40)

entry_P_min.pack(pady=5, padx=20, fill="x")

# Поле вывода результата

tk.Label(root, text="Количество полных заправок резервуара PCP-винтовки/пистолета, n = V / v * (P - P_макс) / (P_макс - P_мин)").pack(anchor="w", padx=20, pady=(10, 0))

entry_result = tk.Entry(root, width=40, font=("Arial", 10, "bold"), justify="center")

entry_result.pack(pady=5, padx=20, fill="x")

# Кнопки

btn_frame = tk.Frame(root)

btn_frame.pack(pady=15)

btn_calculate = tk.Button(btn_frame, text="Вычислить", command=calculate_refills, width=15, bg="#4CAF50", fg="white")

btn_calculate.pack(side="left", padx=5)

btn_exit = tk.Button(btn_frame, text="Завершить", command=on_close, width=15, bg="#f44336", fg="white")

btn_exit.pack(side="left", padx=5)

# Запуск главного цикла

root.mainloop()

***

Как работает программа

1. Используется библиотека tkinter (встроена в стандартный дистрибутив Python).

2. Интерфейс:

• В верхней части – заголовок с описанием задачи.

• Ниже – 5 полей для ввода параметров (с понятными подписями).

• Под ними – поле для вывода результата.

• Внизу – две кнопки: «Вычислить» и «Завершить».

3. Вводимые параметры:

• V – объём баллона (см³).

• v – объём резервуара оружия (см³).

• P – начальное давление в баллоне (бар).

• P_макс – требуемое максимальное давление в резервуаре (бар).

• P_мин – минимальное (остаточное) давление в резервуаре (бар).

4. Формула расчёта:

• n = V / v * (P - Pмакс) / (Pмакс - Pмин),

где V – объём баллона со сжатым воздухом (в кубических сантиметрах);

v – объём резервуара винтовки/пистолета (в кубических сантиметрах);

P – давление в баллоне со сжатым воздухом до начала заправки резервуара (в барах);

Pмакс – максимальное давление, до которого требуется заправить резервуар PCP-винтовки/пистолета (в барах);

Pмин – минимальное (остаточное) давление в резервуаре PCP-винтовки/пистолета (в барах).

• Результат округляется вниз до целого числа (только полные заправки).

5. Обработка ошибок:

• Проверка на некорректный ввод (если вводятся не числа).

• Проверка на положительные значения объёмов и давлений.

• Проверка, что P_макс > P_мин и P > P_макс (иначе заправка невозможна).

6. Кнопки:

• «Вычислить» – запускает расчёт и выводит результат.

• «Завершить» – закрывает программу.

-2

***

Как запустить

1. Убедитесь, что у вас установлен Python (3.x).

2. Сохраните код в файл, например, pcp_calculator.py.

3. Запустите файл через командную строку (python pcp_calculator.py) или двойным щелчком (если ассоциировано с Python).