en
Feedback

Don't get caught by a cheater! Telemetrio finds and tags such channels šŸ‘‰ If you want to see the tag, subscribe

Learn Python Coding

Learn Python Coding

Open in Telegram

Learn Python through simple, practical examples and real coding ideas. Clear explanations, useful snippets, and hands-on learning for anyone starting or improving their programming skills. Admin: @HusseinSheikho || @Hussein_Sheikho

Show more

šŸ“ˆ Analytical overview of Telegram channel Learn Python Coding

Channel Learn Python Coding (@pythonre) in the English language segment is an active participant. Currently, the community unites 40 869 subscribers, ranking 3 287 in the Technologies & Applications category and 9 131 in the India region.

šŸ“Š Audience metrics and dynamics

Since its creation on невіГомо, the project has demonstrated rapid growth, gathering an audience of 40 869 subscribers.

According to the latest data from 31 October, 2026, the channel demonstrates stable activity. Although there has been a change in the number of participants by 306 over the last 30 days and by -6 over the last 24 hours, overall reach remains high.

  • Verification status: Not verified
  • Engagement rate (ER): The average audience engagement rate is 5.91%. Within the first 24 hours after publication, content typically collects 1.63% reactions from the total number of subscribers.
  • Post reach: On average, each post receives 2 414 views. Within the first day, a publication typically gains 665 views.
  • Reactions and interaction: The audience actively supports content: the average number of reactions per post is 3.
  • Thematic interests: Content is focused on key topics such as math, harvard, oxford, supervision, waybienad.

šŸ“ Description and content policy

The author describes the resource as a platform for expressing subjective opinions:
ā€œLearn Python through simple, practical examples and real coding ideas. Clear explanations, useful snippets, and hands-on learning for anyone starting or improving their programming skills. Admin: @HusseinSheikho || @Hussein_Sheikhoā€

Thanks to the high frequency of updates (latest data received on 01 November, 2026), the channel maintains relevance and a high level of publication reach. Analytics show that the audience actively interacts with content, making it an important point of influence in the Technologies & Applications category.

Buy Ad
40 869
Subscribers
-624 hours
-237 days
+30630 days
Posts Archive
def square(n):
    return n * n

numbers = [1, 2, 3, 4]
squared_numbers = map(square, numbers)
print(list(squared_numbers))
[1, 4, 9, 16]
--- #Python #FunctionalProgramming #Keywords #21. filter() Constructs an iterator from elements of an iterable for which a function returns true.
def is_even(n):
    return n % 2 == 0

numbers = [1, 2, 3, 4, 5, 6]
even_numbers = filter(is_even, numbers)
print(list(even_numbers))
[2, 4, 6]
#22. lambda Creates a small anonymous function.
multiply = lambda a, b: a * b
print(multiply(5, 6))
30
#23. def Keyword used to define a function.
def greet(name):
    return f"Hello, {name}!"

print(greet("World"))
Hello, World!
#24. return Keyword used to exit a function and return a value.
def add(a, b):
    return a + b

result = add(7, 8)
print(result)
15
#25. isinstance() Checks if an object is an instance of a specified class.
number = 10
print(isinstance(number, int))
print(isinstance(number, str))
True
False
--- #Python #ControlFlow #Keywords #26. if, elif, else Used for conditional execution.
score = 85
if score >= 90:
    print("Grade A")
elif score >= 80:
    print("Grade B")
else:
    print("Grade C")
Grade B
#27. for Used to iterate over a sequence (like a list, tuple, or string).
colors = ["red", "green", "blue"]
for color in colors:
    print(color)
red
green
blue
#28. while Creates a loop that executes as long as a condition is true.
count = 0
while count < 3:
    print(f"Count is {count}")
    count += 1
Count is 0
Count is 1
Count is 2
#29. break Exits the current loop.
for i in range(10):
    if i == 5:
        break
    print(i)
0
1
2
3
4
#30. continue Skips the rest of the code inside the current loop iteration and proceeds to the next one.
for i in range(5):
    if i == 2:
        continue
    print(i)
0
1
3
4
--- #Python #StringMethods #TextManipulation #31. .upper() Converts a string into upper case.
message = "hello python"
print(message.upper())
HELLO PYTHON
#32. .lower() Converts a string into lower case.
message = "HELLO PYTHON"
print(message.lower())
hello python
#33. .strip() Removes any leading and trailing whitespace.
text = "   some space   "
print(text.strip())
some space
#34. .split() Splits the string at the specified separator and returns a list.
sentence = "Python is fun"
words = sentence.split(' ')
print(words)
['Python', 'is', 'fun']
#35. .join() Joins the elements of an iterable to the end of the string.
words = ['Python', 'is', 'awesome']
sentence = " ".join(words)
print(sentence)
Python is awesome
--- #Python #MoreStringMethods #Text #36. .replace() Returns a string where a specified value is replaced with another value.
text = "I like cats."
new_text = text.replace("cats", "dogs")
print(new_text)
I like dogs.

#Python #Top60 #BuiltInFunctions #1. print() Prints the specified message to the screen.
print("Hello, World!")
Hello, World!
#2. len() Returns the number of items in an object.
my_list = [1, 2, 3, 4]
print(len(my_list))
4
#3. type() Returns the type of an object.
name = "Python"
print(type(name))
<class 'str'>
#4. input() Allows user input.
username = input("Enter your name: ")
print("Hello, " + username)
Enter your name: Alex
Hello, Alex
#5. int() Converts a value to an integer number.
string_number = "101"
number = int(string_number)
print(number + 9)
110
--- #Python #DataTypes #Conversion #6. str() Converts a value to a string.
age = 25
print("My age is " + str(age))
My age is 25
#7. float() Converts a value to a floating-point number.
integer_value = 5
print(float(integer_value))
5.0
#8. bool() Converts a value to a Boolean (True or False).
print(bool(1))
print(bool(0))
print(bool("Hello"))
print(bool(""))
True
False
True
False
#9. list() Converts an iterable (like a tuple or string) to a list.
my_tuple = (1, 2, 3)
my_list = list(my_tuple)
print(my_list)
[1, 2, 3]
#10. tuple() Converts an iterable to a tuple.
my_list = [4, 5, 6]
my_tuple = tuple(my_list)
print(my_tuple)
(4, 5, 6)
--- #Python #Math #Functions #11. sum() Returns the sum of all items in an iterable.
numbers = [10, 20, 30]
print(sum(numbers))
60
#12. max() Returns the largest item in an iterable.
numbers = [5, 29, 12, 99]
print(max(numbers))
99
#13. min() Returns the smallest item in an iterable.
numbers = [5, 29, 12, 99]
print(min(numbers))
5
#14. abs() Returns the absolute (positive) value of a number.
negative_number = -15
print(abs(negative_number))
15
#15. round() Rounds a number to a specified number of decimals.
pi = 3.14159
print(round(pi, 2))
3.14
--- #Python #Iterables #Functions #16. range() Returns a sequence of numbers, starting from 0 by default, and increments by 1.
for i in range(5):
    print(i)
0
1
2
3
4
#17. sorted() Returns a new sorted list from the items in an iterable.
unsorted_list = [3, 1, 4, 1, 5, 9]
sorted_list = sorted(unsorted_list)
print(sorted_list)
[1, 1, 3, 4, 5, 9]
#18. enumerate() Returns an enumerate object, which contains pairs of index and value.
fruits = ['apple', 'banana', 'cherry']
for index, fruit in enumerate(fruits):
    print(index, fruit)
0 apple
1 banana
2 cherry
#19. zip() Returns an iterator that aggregates elements from two or more iterables.
names = ['Alice', 'Bob', 'Charlie']
ages = [25, 30, 35]
for name, age in zip(names, ages):
    print(f"{name} is {age} years old.")
Alice is 25 years old.
Bob is 30 years old.
Charlie is 35 years old.
#20. map() Applies a given function to each item of an iterable and returns a map object.

photo content

✨ jailbreak | AI Coding Glossary ✨ šŸ“– A method of prompting that bypasses model safety constraints to elicit disallowed or unintended behavior. šŸ·ļø #Python

✨ structured output | AI Coding Glossary ✨ šŸ“– Model responses that conform to a specified format, such as a JSON Schema. šŸ·ļø #Python

✨ Build a Python MCP Client to Test Servers From Your Terminal ✨ šŸ“– Follow this Python project to build an MCP client that di
✨ Build a Python MCP Client to Test Servers From Your Terminal ✨ šŸ“– Follow this Python project to build an MCP client that discovers MCP server capabilities and feeds an AI-powered chat with tool calls. šŸ·ļø #intermediate #ai #projects

By combining all the code from the steps above into database.py and main.py, you have a robust, database-driven desktop application. Results: Data Persistence: Your inventory and invoice data is saved in warehouse.db and will be there when you restart the application. Integrated Workflow: Adding a purchase directly increases stock. A sale checks for and decreases stock. Production consumes raw materials and creates finished goods, all reflected in the central inventory table. Separation of Concerns: The UI logic in main.py is cleanly separated from the data logic in database.py, making the code easier to maintain and extend. Reporting: You can easily export a snapshot of your current inventory to a CSV file for analysis in other programs like Excel or Google Sheets. Discussion and Next Steps: Scalability: While SQLite is excellent for small-to-medium applications, a large-scale, multi-user system would benefit from a client-server database like PostgreSQL or MySQL. Invoice Complexity: The current invoice system is simplified. A real system would allow multiple items per invoice and store historical invoice data for viewing and printing. User Interface (UI/UX): The UI is functional but could be greatly improved with better layouts, icons, search/filter functionality in tables, and more intuitive workflows. Error Handling: The error handling is basic. A production-grade app would have more comprehensive checks for user input and database operations. • Advanced Features: Future additions could include user authentication, supplier and customer management, barcode scanning, and more detailed financial reporting. This project forms a powerful template for building custom internal business tools with Python. #ProjectComplete #SoftwareEngineering #ERP #PythonGUI #BusinessApp ━━━━━━━━━━━━━━━ By: @DataScience4 ✨

# In __init__, add the tabs and call the setups
self.tabs.addTab(self.production_tab, "Production")
self.setup_production_ui()
self.tabs.addTab(self.reports_tab, "Reporting")
self.setup_reports_ui()

# Define Bill of Materials (can be moved to DB in a real app)
self.bill_of_materials = {
    'Wooden Table': {'Wood Plank': 5, 'Varnish': 1},
    'Wooden Chair': {'Wood Plank': 2, 'Nail': 10}
}

def setup_production_ui(self):
    layout = QVBoxLayout()
    form = QFormLayout()
    self.product_to_make = QComboBox()
    self.product_to_make.addItems(self.bill_of_materials.keys())
    self.production_qty = QSpinBox()
    self.production_qty.setRange(1, 100)
    
    form.addRow("Product:", self.product_to_make)
    form.addRow("Quantity:", self.production_qty)
    produce_btn = QPushButton("Produce Items")
    produce_btn.clicked.connect(self.run_production)
    
    layout.addLayout(form)
    layout.addWidget(produce_btn)
    self.production_tab.setLayout(layout)

def run_production(self):
    product_name = self.product_to_make.currentText()
    qty_to_make = self.production_qty.value()
    bom = self.bill_of_materials[product_name]
    
    # 1. Check stock for all required materials
    for material, required_qty in bom.items():
        item_data = db.find_item_by_name(material)
        if not item_data or item_data[2] < required_qty * qty_to_make:
            QMessageBox.critical(self, "Production Halt", f"Not enough {material} in stock.")
            return

    # 2. If stock is sufficient, consume materials
    for material, required_qty in bom.items():
        item_data = db.find_item_by_name(material)
        db.update_item_quantity(item_data[0], - (required_qty * qty_to_make))

    # 3. Add finished product to inventory
    finished_product = db.find_item_by_name(product_name)
    if finished_product:
        db.update_item_quantity(finished_product[0], qty_to_make)
    else:
        # You'd calculate a price here in a real app
        db.add_inventory_item(product_name, qty_to_make, price=50.0)

    QMessageBox.information(self, "Success", f"Produced {qty_to_make} of {product_name}.")
    self.load_inventory_data()
    self.update_item_combos()

def setup_reports_ui(self):
    layout = QVBoxLayout()
    label = QLabel("Select a report to export to CSV:")
    self.report_type = QComboBox()
    self.report_type.addItems(["Current Inventory", "Sales History"]) # Add more as needed
    export_btn = QPushButton("Export Report")
    export_btn.clicked.connect(self.export_report)
    
    layout.addWidget(label)
    layout.addWidget(self.report_type)
    layout.addWidget(export_btn)
    layout.addStretch()
    self.reports_tab.setLayout(layout)

def export_report(self):
    report = self.report_type.currentText()
    path, _ = QFileDialog.getSaveFileName(self, "Save CSV", "", "CSV Files (*.csv)")
    if not path:
        return

    try:
        if report == "Current Inventory":
            data = db.get_inventory()
            headers = ['ID', 'Name', 'Quantity', 'Price']
            with open(path, 'w', newline='') as f:
                writer = csv.writer(f)
                writer.writerow(headers)
                writer.writerows(data)
        # Add other report types here
        # elif report == "Sales History": ...
        
        QMessageBox.information(self, "Success", f"Report exported to {path}")
    except Exception as e:
        QMessageBox.critical(self, "Export Error", f"An error occurred: {e}")

# Hashtags: #Production #Reporting #CSVExport #BusinessLogic
--- #Step 5: Final Results and Discussion

# In __init__, add the tab and call the setup
self.tabs.addTab(self.purchase_tab, "Purchasing (Incoming)")
self.setup_purchase_ui()

# In __init__, add the sales tab and call setup
self.tabs.addTab(self.sales_tab, "Sales (Outgoing)")
self.setup_sales_ui()

# New methods for the class
def setup_purchase_ui(self):
    # This is a simplified UI for demonstration
    layout = QVBoxLayout()
    form = QFormLayout()
    self.supplier_name = QLineEdit()
    self.purchase_item = QComboBox()
    self.purchase_qty = QSpinBox()
    self.purchase_qty.setRange(1, 1000)
    
    form.addRow("Supplier Name:", self.supplier_name)
    form.addRow("Item:", self.purchase_item)
    form.addRow("Quantity:", self.purchase_qty)
    
    add_purchase_btn = QPushButton("Record Purchase")
    add_purchase_btn.clicked.connect(self.record_purchase)
    
    layout.addLayout(form)
    layout.addWidget(add_purchase_btn)
    self.purchase_tab.setLayout(layout)
    self.update_item_combos()

def setup_sales_ui(self):
    # UI is very similar to purchase
    layout = QVBoxLayout()
    form = QFormLayout()
    self.customer_name = QLineEdit()
    self.sales_item = QComboBox()
    self.sales_qty = QSpinBox()
    self.sales_qty.setRange(1, 1000)
    
    form.addRow("Customer Name:", self.customer_name)
    form.addRow("Item:", self.sales_item)
    form.addRow("Quantity:", self.sales_qty)
    
    add_sale_btn = QPushButton("Record Sale")
    add_sale_btn.clicked.connect(self.record_sale)
    
    layout.addLayout(form)
    layout.addWidget(add_sale_btn)
    self.sales_tab.setLayout(layout)

def update_item_combos(self):
    self.purchase_item.clear()
    self.sales_item.clear()
    items = db.get_inventory()
    for item in items:
        # Store the full item tuple as userData
        self.purchase_item.addItem(item[1], userData=item) 
        self.sales_item.addItem(item[1], userData=item)

def record_purchase(self):
    supplier = self.supplier_name.text()
    item_data = self.purchase_item.currentData()
    qty = self.purchase_qty.value()
    if not supplier or not item_data:
        QMessageBox.warning(self, "Input Error", "Please fill all fields.")
        return
        
    invoice_item = {'id': item_data[0], 'quantity': qty, 'price': item_data[3]}
    db.create_invoice('PURCHASE', supplier, [invoice_item])
    
    QMessageBox.information(self, "Success", "Purchase recorded successfully.")
    self.load_inventory_data() # Refresh all UIs
    self.update_item_combos()

def record_sale(self):
    customer = self.customer_name.text()
    item_data = self.sales_item.currentData()
    qty_to_sell = self.sales_qty.value()
    
    if not customer or not item_data:
        QMessageBox.warning(self, "Input Error", "Please fill all fields.")
        return
    
    # Check for sufficient stock
    if item_data[2] < qty_to_sell:
        QMessageBox.critical(self, "Stock Error", f"Not enough {item_data[1]} in stock. Available: {item_data[2]}")
        return

    invoice_item = {'id': item_data[0], 'quantity': qty_to_sell, 'price': item_data[3]}
    db.create_invoice('SALE', customer, [invoice_item])
    
    QMessageBox.information(self, "Success", "Sale recorded successfully.")
    self.load_inventory_data()
    self.update_item_combos()
Note: This invoice UI is simplified to one item per invoice. A real app would use a table to build a multi-item invoice before saving. --- #Step 4: Production Tab and Reporting The production tab will consume raw materials to create a finished product. The reporting tab will export inventory data to a CSV file. Add to main.py's WarehouseApp class:

def create_invoice(invoice_type, party_name, items):
    conn = connect()
    cursor = conn.cursor()
    # Create the invoice record
    cursor.execute("INSERT INTO invoices (type, party_name) VALUES (?, ?)", (invoice_type, party_name))
    invoice_id = cursor.lastrowid
    
    # Add items to the invoice and update inventory
    for item in items:
        item_id, quantity, price = item['id'], item['quantity'], item['price']
        cursor.execute(
            "INSERT INTO invoice_items (invoice_id, item_id, quantity, price_per_unit) VALUES (?, ?, ?, ?)",
            (invoice_id, item_id, quantity, price)
        )
        # Update inventory quantity
        change = quantity if invoice_type == 'PURCHASE' else -quantity
        cursor.execute("UPDATE inventory SET quantity = quantity + ? WHERE id = ?", (change, item_id))
    
    conn.commit()
    conn.close()
    return invoice_id
Add to main.py's WarehouseApp class:

import sys
import csv
from PyQt5.QtWidgets import *
import database as db # Import our database module

class WarehouseApp(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Warehouse ERP System")
        self.setGeometry(100, 100, 1000, 700)
        db.setup_database() # Ensure tables are created

        self.tabs = QTabWidget()
        self.setCentralWidget(self.tabs)
        
        # Create tabs
        self.inventory_tab = QWidget()
        self.purchase_tab = QWidget() # Incoming
        self.sales_tab = QWidget()    # Outgoing
        self.production_tab = QWidget()
        self.reports_tab = QWidget()

        self.tabs.addTab(self.inventory_tab, "Inventory")
        # Add other tabs later...

        self.setup_inventory_ui()
        self.load_inventory_data()

    def setup_inventory_ui(self):
        layout = QVBoxLayout()
        # Table view
        self.inventory_table = QTableWidget()
        self.inventory_table.setColumnCount(4)
        self.inventory_table.setHorizontalHeaderLabels(['ID', 'Name', 'Quantity', 'Price'])
        self.inventory_table.setEditTriggers(QAbstractItemView.NoEditTriggers)
        layout.addWidget(self.inventory_table)
        
        # Form for adding new items
        form = QFormLayout()
        self.item_name = QLineEdit()
        self.item_qty = QSpinBox()
        self.item_qty.setRange(0, 99999)
        self.item_price = QLineEdit()
        form.addRow("Name:", self.item_name)
        form.addRow("Quantity:", self.item_qty)
        form.addRow("Price:", self.item_price)
        add_btn = QPushButton("Add New Item")
        add_btn.clicked.connect(self.add_item)
        layout.addLayout(form)
        layout.addWidget(add_btn)
        
        self.inventory_tab.setLayout(layout)

    def load_inventory_data(self):
        items = db.get_inventory()
        self.inventory_table.setRowCount(len(items))
        for row_num, row_data in enumerate(items):
            for col_num, data in enumerate(row_data):
                self.inventory_table.setItem(row_num, col_num, QTableWidgetItem(str(data)))

    def add_item(self):
        name = self.item_name.text()
        qty = self.item_qty.value()
        price = float(self.item_price.text())
        if not name:
            QMessageBox.warning(self, "Input Error", "Item name cannot be empty.")
            return
        if db.add_inventory_item(name, qty, price):
            self.load_inventory_data() # Refresh table
            self.item_name.clear()
            self.item_qty.setValue(0)
            self.item_price.clear()
        else:
            QMessageBox.warning(self, "DB Error", f"Item '{name}' already exists.")

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = WarehouseApp()
    window.show()
    sys.exit(app.exec_())

# Hashtags: #PyQt5 #GUI #CRUD #InventoryManagement
--- #Step 3: Purchase (Incoming) and Sales (Outgoing) Tabs We'll manage invoices. A purchase increases stock, and a sale decreases it. We need to add functions to database.py first, then build the UI. Add to database.py:

#PyQt5 #SQLite #DesktopApp #WarehouseManagement #ERP #Python Lesson: Advanced Warehouse ERP with PyQt5, SQLite, and Reporting This tutorial covers building a complete desktop Enterprise Resource Planning (ERP) application for warehouse management. It features persistent storage using SQLite, inventory control, sales and purchase invoice management, a production module, and the ability to export reports to CSV. --- #Step 1: Database Setup (database.py) First, we create a dedicated file to handle all database interactions. This separation of concerns is crucial for a scalable application. Create a file named database.py.
import sqlite3
import csv

DB_NAME = 'warehouse.db'

def connect():
    return sqlite3.connect(DB_NAME)

def setup_database():
    conn = connect()
    cursor = conn.cursor()
    # Inventory Table: Stores raw materials and finished goods
    cursor.execute('''
        CREATE TABLE IF NOT EXISTS inventory (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            name TEXT NOT NULL UNIQUE,
            quantity INTEGER NOT NULL,
            price REAL NOT NULL
        )
    ''')
    # Invoices Table: Tracks both sales and purchases
    cursor.execute('''
        CREATE TABLE IF NOT EXISTS invoices (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            type TEXT NOT NULL, -- 'SALE' or 'PURCHASE'
            party_name TEXT, -- Customer or Supplier Name
            date TIMESTAMP DEFAULT CURRENT_TIMESTAMP
        )
    ''')
    # Invoice Items Table: Links items from inventory to an invoice
    cursor.execute('''
        CREATE TABLE IF NOT EXISTS invoice_items (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            invoice_id INTEGER,
            item_id INTEGER,
            quantity INTEGER NOT NULL,
            price_per_unit REAL NOT NULL,
            FOREIGN KEY (invoice_id) REFERENCES invoices (id),
            FOREIGN KEY (item_id) REFERENCES inventory (id)
        )
    ''')
    conn.commit()
    conn.close()

def get_inventory():
    conn = connect()
    cursor = conn.cursor()
    cursor.execute("SELECT id, name, quantity, price FROM inventory ORDER BY name")
    items = cursor.fetchall()
    conn.close()
    return items

def add_inventory_item(name, quantity, price):
    conn = connect()
    cursor = conn.cursor()
    try:
        cursor.execute("INSERT INTO inventory (name, quantity, price) VALUES (?, ?, ?)", (name, quantity, price))
        conn.commit()
    except sqlite3.IntegrityError:
        # Item with this name already exists
        return False
    finally:
        conn.close()
    return True

def update_item_quantity(item_id, change_in_quantity):
    conn = connect()
    cursor = conn.cursor()
    cursor.execute("UPDATE inventory SET quantity = quantity + ? WHERE id = ?", (change_in_quantity, item_id))
    conn.commit()
    conn.close()
    
def find_item_by_name(name):
    conn = connect()
    cursor = conn.cursor()
    cursor.execute("SELECT * FROM inventory WHERE name = ?", (name,))
    item = cursor.fetchone()
    conn.close()
    return item

# Add more functions here for invoices, etc. as we build the app.

# Hashtags: #SQLite #DatabaseDesign #DataPersistence #Python
--- #Step 2: Main Application Shell and Inventory Tab Now, create the main application file, main.py. We'll build the window, tabs, and fully implement the Inventory tab, which will read from and write to our SQLite database.

⚠ Message was hidden by channel owner

⚠ Message was hidden by channel owner

⚠ Message was hidden by channel owner

⚠ Message was hidden by channel owner

⚠ Message was hidden by channel owner

✨ tensor parameter | AI Coding Glossary ✨ šŸ“– A learned multi-dimensional array that a model updates during training to shape its computations. šŸ·ļø #Python

✨ weight | AI Coding Glossary ✨ šŸ“– A learned scalar or tensor that scales signals in a model and is updated during training to shape predictions. šŸ·ļø #Python

# Open the video file
video_path = 'industrial_video.mp4'
cap = cv2.VideoCapture(video_path)

# Loop through the video frames
while cap.isOpened():
    # Read a frame from the video
    success, frame = cap.read()

    if success:
        # Run YOLOv8 inference on the frame
        results = model(frame)

        # A flag to check if fire was detected in the current frame
        fire_detected_in_frame = False

        # Visualize the results on the frame
        annotated_frame = results[0].plot()

        # Process detection results
        for r in results:
            for box in r.boxes:
                # Check if the detected class is 'fire'
                # model.names[0] should correspond to 'fire' in your custom model
                if model.names[int(box.cls[0])] == 'fire' and box.conf[0] > 0.5:
                    fire_detected_in_frame = True
                    break
        
        # If fire is detected and alarm is not already on, trigger alarm
        if fire_detected_in_frame and not alarm_on:
            alarm_on = True
            # Run the alarm sound in a background thread to not block video feed
            alarm_thread = threading.Thread(target=play_alarm)
            alarm_thread.start()

        # Display the annotated frame
        cv2.imshow("YOLOv8 Fire Detection", annotated_frame)

        # Break the loop if 'q' is pressed
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        # Break the loop if the end of the video is reached
        break

# Release the video capture object and close the display window
cap.release()
cv2.destroyAllWindows()

# Hashtags: #RealTimeDetection #VideoProcessing #OpenCV
--- #Step 4: Results and Discussion After running the script, you will see a window playing the video. When the model detects an object it identifies as 'fire' with a confidence score above 50%, it will: • Draw a colored box around the fire. • Print "ALARM: Fire Detected!" to the console. • Play the alarm.wav sound. Discussion of Results: Model Performance: The accuracy of this system depends entirely on the quality of your custom-trained model (fire_model.pt). A model trained on a diverse dataset of industrial fires (different lighting, angles, sizes) will perform best. False Positives: The system might incorrectly identify orange/red lights, reflections, or welding sparks as fire. This is a common challenge. To fix this, you need to add more "negative" images (images of things that look like fire but aren't) to your training dataset. Thresholding: The confidence threshold (box.conf[0] > 0.5) is a critical parameter. A lower value increases the chance of detecting real fires but also increases false alarms. A higher value reduces false alarms but might miss smaller or less obvious fires. You must tune this value based on your specific environment. Real-World Implementation: For a real industrial facility, you would replace the video file with a live camera stream (cv2.VideoCapture(0) for a webcam) and integrate the alarm logic with a physical siren or a central monitoring system via an API or GPIO pins. #ProjectComplete #AIforGood #IndustrialSafety ━━━━━━━━━━━━━━━ By: @DataScience4 ✨