Creëer een interactieve Python CLI-tool voor specifieke doeleinden
description
Met deze prompt kun je een gebruiksvriendelijke Python CLI-tool maken waarmee je eenvoudig specifieke taken uitvoert. De prompt richt zich op interactie en foutafhandeling, wat bijdraagt aan robuuste en toegankelijke scripts, anders dan standaard scriptontwikkeling of automatisering. Dit lost problemen op bij het bouwen van command line applicaties die gebruikers effectief begeleiden.
prompt
Help me een interactieve command line interface (CLI) tool te schrijven in Python waarmee gebruikers <beschrijf h ...
try_prompt
generate_helper
disclaimerOnPageApi
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Natuurlijk! Hier is een eenvoudige maar interactieve command line interface (CLI) tool in Python waarmee gebruikers taken kunnen beheren en bijhouden. De tool ondersteunt het toevoegen, bekijken, voltooien en verwijderen van taken, met gebruikersinvoer, foutafhandeling en duidelijke instructies.
```python
import sys
# Lijst om taken op te slaan
taken = []
def toon_instructies():
print("\nWelkom bij de Takenbeheer CLI!")
print("Kies een optie:")
print("1. Taak toevoegen")
print("2. Taken bekijken")
print("3. Taak voltooien")
print("4. Taak verwijderen")
print("5. Afsluiten\n")
def taak_toevoegen():
taak = input("Voer de taak in: ").strip()
if taak:
taken.append({"omschrijving": taak, "voltooid": False})
print(f"Taak '{taak}' toegevoegd.")
else:
print("Ongeldige invoer. Probeer het opnieuw.")
def taken_bekijken():
if not taken:
print("Geen taken gevonden.")
return
print("\nLijst van taken:")
for idx, taak in enumerate(taken, start=1):
status = "Voltooid" if taak["voltooid"] else "Niet voltooid"
print(f"{idx}. {taak['omschrijving']} [{status}]")
print()
def taak_voltooien():
try:
index = int(input("Voer het nummer van de te voltooien taak in: "))
if 1 <= index <= len(taken):
if not taken[index - 1]["voltooid"]:
taken[index - 1]["voltooid"] = True
print(f"Taak '{taken[index - 1]['omschrijving']}' gemarkeerd als voltooid.")
else:
print("Deze taak is al voltooid.")
else:
print("Ongeldig nummer. Probeer het opnieuw.")
except ValueError:
print("Ongeldige invoer. Voer een numerieke waarde in.")
def taak_verwijderen():
try:
index = int(input("Voer het nummer van de te verwijderen taak in: "))
if 1 <= index <= len(taken):
verwijderde_taak = taken.pop(index - 1)
print(f"Taak '{verwijderde_taak['omschrijving']}' verwijderd.")
else:
print("Ongeldig nummer. Probeer het opnieuw.")
except ValueError:
print("Ongeldige invoer. Voer een numerieke waarde in.")
def main():
toon_instructies()
while True:
keuze = input("Maak uw keuze (1-5): ").strip()
if keuze == '1':
taak_toevoegen()
elif keuze == '2':
taken_bekijken()
elif keuze == '3':
taak_voltooien()
elif keuze == '4':
taak_verwijderen()
elif keuze == '5':
print("Afsluiten. Tot ziens!")
sys.exit()
else:
print("Ongeldige keuze. Probeer het opnieuw.")
# Optioneel: toon opnieuw de instructies
toon_instructies()
if __name__ == "__main__":
main()
```
**Hoe werkt deze tool?**
- Bij het starten zie je instructies met opties.
- Je kunt taken toevoegen, bekijken, voltooien of verwijderen.
- De invoer wordt gecontroleerd op geldigheid.
- Bij ongeldige invoer krijg je een foutmelding en wordt je gevraagd opnieuw te proberen.
- De tool blijft draaien totdat je kiest voor afsluiten.
Je kunt deze code opslaan in een bestand, bijvoorbeeld `taken_cli.py`, en uitvoeren met `python taken_cli.py`.
provider: deepseek
model: deepseek-chat
Hier is een interactieve CLI-taakmanager in Python met uitgebreide functionaliteit:
```python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import json
import os
from datetime import datetime
class TaakManager:
def __init__(self, bestandsnaam="taken.json"):
self.bestandsnaam = bestandsnaam
self.taken = self._laad_taken()
def _laad_taken(self):
"""Laad taken uit JSON-bestand of retourneer lege lijst als bestand niet bestaat"""
try:
if os.path.exists(self.bestandsnaam):
with open(self.bestandsnaam, 'r', encoding='utf-8') as f:
return json.load(f)
return []
except (json.JSONDecodeError, IOError) as e:
print(f"Fout bij laden van taken: {e}")
return []
def _sla_taken_op(self):
"""Sla taken op in JSON-bestand"""
try:
with open(self.bestandsnaam, 'w', encoding='utf-8') as f:
json.dump(self.taken, f, indent=2, ensure_ascii=False)
except IOError as e:
print(f"Fout bij opslaan van taken: {e}")
def toon_menu(self):
"""Toon het hoofdmenu"""
print("\n" + "="*50)
print("TAKMANAGER - JOUW PERSOONLIJKE TAKENBEHEER")
print("="*50)
print("1. Toon alle taken")
print("2. Voeg nieuwe taak toe")
print("3. Markeer taak als voltooid")
print("4. Verwijder taak")
print("5. Zoek taken")
print("6. Statistieken")
print("7. Exit")
print("-"*50)
def toon_taken(self, taken_lijst=None):
"""Toon alle taken of een gefilterde lijst"""
taken = taken_lijst if taken_lijst else self.taken
if not taken:
print("\nGeen taken gevonden!")
return
print(f"\n{'ID':<4} {'Status':<12} {'Taak':<30} {'Datum toegevoegd':<20}")
print("-"*70)
for i, taak in enumerate(taken, 1):
status = "✓ VOLTOOID" if taak['voltooid'] else "✗ PENDING"
print(f"{i:<4} {status:<12} {taak['beschrijving']:<30} {taak['datum']:<20}")
def voeg_taak_toe(self):
"""Voeg een nieuwe taak toe"""
try:
beschrijving = input("\nVoer taakbeschrijving in: ").strip()
if not beschrijving:
print("Taakbeschrijving mag niet leeg zijn!")
return
nieuwe_taak = {
'id': len(self.taken) + 1,
'beschrijving': beschrijving,
'voltooid': False,
'datum': datetime.now().strftime("%Y-%m-%d %H:%M")
}
self.taken.append(nieuwe_taak)
self._sla_taken_op()
print(f"Taak '{beschrijving}' succesvol toegevoegd!")
except KeyboardInterrupt:
print("\nOperatie geannuleerd.")
except Exception as e:
print(f"Fout bij toevoegen taak: {e}")
def markeer_voltooid(self):
"""Markeer een taak als voltooid"""
try:
self.toon_taken()
if not self.taken:
return
taak_id = input("\nVoer ID in van te voltooien taak: ").strip()
if not taak_id.isdigit():
print("Voer een geldig nummer in!")
return
taak_id = int(taak_id) - 1
if 0 <= taak_id < len(self.taken):
if not self.taken[taak_id]['voltooid']:
self.taken[taak_id]['voltooid'] = True
self.taken[taak_id]['voltooid_datum'] = datetime.now().strftime("%Y-%m-%d %H:%M")
self._sla_taken_op()
print(f"Taak '{self.taken[taak_id]['beschrijving']}' gemarkeerd als voltooid!")
else:
print("Deze taak is al voltooid!")
else:
print("Ongeldig ID!")
except (ValueError, IndexError):
print("Ongeldige invoer!")
except KeyboardInterrupt:
print("\nOperatie geannuleerd.")
def verwijder_taak(self):
"""Verwijder een taak"""
try:
self.toon_taken()
if not self.taken:
return
taak_id = input("\nVoer ID in van te verwijderen taak: ").strip()
if not taak_id.isdigit():
print("Voer een geldig nummer in!")
return
taak_id = int(taak_id) - 1
if 0 <= taak_id < len(self.taken):
verwijderde_taak = self.taken.pop(taak_id)
# Update IDs
for i, taak in enumerate(self.taken):
taak['id'] = i + 1
self._sla_taken_op()
print(f"Taak '{verwijderde_taak['beschrijving']}' verwijderd!")
else:
print("Ongeldig ID!")
except (ValueError, IndexError):
print("Ongeldige invoer!")
except KeyboardInterrupt:
print("\nOperatie geannuleerd.")
def zoek_taken(self):
"""Zoek taken op trefwoord"""
try:
zoekterm = input("\nVoer zoekterm in: ").strip().lower()
if not zoekterm:
print("Zoekterm mag niet leeg zijn!")
return
gevonden_taken = [
taak for taak in self.taken
if zoekterm in taak['beschrijving'].lower()
]
if gevonden_taken:
print(f"\nGevonden {len(gevonden_taken)} taak(en) met '{zoekterm}':")
self.toon_taken(gevonden_taken)
else:
print(f"Geen taken gevonden met '{zoekterm}'")
except KeyboardInterrupt:
print("\nZoekopdracht geannuleerd.")
def toon_statistieken(self):
"""Toon statistieken over taken"""
totaal = len(self.taken)
voltooid = sum(1 for taak in self.taken if taak['voltooid'])
pending = totaal - voltooid
print("\n" + "="*30)
print("STATISTIEKEN")
print("="*30)
print(f"Totaal aantal taken: {totaal}")
print(f"Voltooide taken: {voltooid}")
print(f"Pending taken: {pending}")
if totaal > 0:
percentage = (voltooid / totaal) * 100
print(f"Voortgang: {percentage:.1f}%")
print("="*30)
def run(self):
"""Hoofdprogramma loop"""
print("Welkom bij de TaakManager CLI!")
print("Typ 'help' voor instructies of 'menu' om het menu te tonen.")
while True:
try:
commando = input("\nVoer een commando in (of 'menu' voor opties): ").strip().lower()
if commando in ['1', 'toon', 'taken']:
self.toon_taken()
elif commando in ['2', 'voeg toe', 'nieuw']:
self.voeg_taak_toe()
elif commando in ['3', 'voltooid', 'markeer']:
self.markeer_voltooid()
elif commando in ['4', 'verwijder', 'delete']:
self.verwijder_taak()
elif commando in ['5', 'zoek', 'search']:
self.zoek_taken()
elif commando in ['6', 'stats', 'statistieken']:
self.toon_statistieken()
elif commando in ['7', 'exit', 'quit', 'afsluiten']:
print("Bedankt voor het gebruiken van TaakManager. Tot ziens!")
break
elif commando in ['menu', 'help', '?']:
self.toon_menu()
elif commando == '':
continue
else:
print("Onbekend commando. Typ 'menu' voor beschikbare opties.")
except KeyboardInterrupt:
print("\n\nProgramma afgesloten.")
break
except Exception as e:
print(f"Er is een onverwachte fout opgetreden: {e}")
def main():
"""Hoofdfunctie om de applicatie te starten"""
try:
manager = TaakManager()
manager.toon_menu()
manager.run()
except Exception as e:
print(f"Fout bij opstarten applicatie: {e}")
if __name__ == "__main__":
main()
```
## Gebruiksaanwijzing:
### Installatie:
```bash
# Sla de code op als taakmanager.py
python3 taakmanager.py
```
### Functionaliteiten:
1. **Toon alle taken** - Bekijk je complete takenlijst
2. **Nieuwe taak toevoegen** - Voeg taken toe met beschrijving
3. **Markeer als voltooid** - Update de status van taken
4. **Verwijder taak** - Verwijder taken uit de lijst
5. **Zoek functie** - Zoek taken op trefwoord
6. **Statistieken** - Zie je voortgang in percentages
7. **Automatisch opslaan** - Taken worden opgeslagen in JSON-formaat
### Gebruik:
- Typ het cijfer van de optie of het commando (bijv. '1' of 'toon')
- Gebruik 'menu' om het hoofdmenu te tonen
- Gebruik Ctrl+C om te annuleren of af te sluiten
### Foutafhandeling:
- Ongeldige invoer wordt netjes afgehandeld
- Bestandsoperaties hebben try-catch blokken
- Keyboard interrupt wordt correct verwerkt
- Lege invoer wordt voorkomen
De applicatie slaat taken automatisch op in een `taken.json` bestand en laadt ze bij opstarten weer in!