Programmiersprache – die neusten Beiträge

Customtkinter "master" Parameter beim erstellen von einem Textfeld?

Hey,

ich habe eine Klasse erstellt die ein Hauptfenster erstellt und möchte aus einer anderen klasse einen Textfeld erstellen der sich auf das Hauptfenster bezieht.
So wie ich es verstanden habe braucht man dafür den Parameter "master" um vorzugeben in welchem Fenster nun der Textfeld angezeigt werden soll.
Leider funktioniert das bei mir nicht so richtig. Hat jemand davon Ahnung und kann mir meinen Fehler zeigen?
lieben Dank! :)

main.py

import view
import controller
import customtkinter as ctk

class Main(view.MainWindow):
   def __init__(self):
       super().__init__()
       self.main_window = view.MainWindow()
       self.main_window.set_size("1680", "900")
       self.main_window.set_title("YourTerminal")
       controller.InputBoxMain()# Nach meinem Verständnis muss hier der Master-Parameter angegeben werden. Wie übergebe ich diesen?

   def run(self):
       self.main_window.get_window().mainloop()

if __name__ == "__main__":
    app = Main()
    app.run()

view.py

import customtkinter as ctk


class MainWindow:
   def __init__(self):
       self.window = ctk.CTk()

   def set_size(self, width, height):
       self.window.geometry(f"{width}x{height}")

   def set_title(self, title):
       self.window.title(title)

   def get_window(self):
       return self.window

class WindowTemplate:
   def __init__(self):
       self.window = ctk.CTkToplevel()

   def set_size(self, width, height):
       self.window.geometry(f"{width}x{height}")

   def set_title(self, title):
       self.window.title(title)

   def get_window(self):
       return self.window

# der master Parameter gibt an wo diese Box angezeigt werden soll
class InputBoxTemplate:
    def __init__(self, master):  # Wie übergebe ich den master Parameter?
        self.master = master
        self.box = ctk.CTkEntry(self.master)

    def set_size(self, width, height, y, x):
        self.box.place(width=width, height=height, pady=y, padyx=x)

    def set_placeholder(self, placeholder):
        self.box._placeholder_text(f"{placeholder}")

controller.py

import view
import customtkinter as ctk
import main
class InputBoxMain(view.InputBoxTemplate, main.Main):
    def __init__(self):
        super().__init__()
        self.master = ctk.CTk()
        self.window = view.InputBoxTemplate(self.master)# Oder der Master-Parameter wird hier übergeben? Hier versuche ich master auf ctk.CTk zu beziehen. Das ist das Haupfenster.
        self.window.set_size(200, 200, 10, 10)
        self.window.set_placeholder("Hier steht der Placeholder")

Hier die Fehlermeldung falls relevant:

Traceback (most recent call last):

 File , line 1, in <module>

  import view

 File , line 2, in <module>

  import main

 File , line 2, in <module>

  import controller

 File " line 4, in <module>

  class InputBoxMain(view.InputBoxTemplate, main.Main):

            ^^^^^^^^^^^^^^^^^^^^^

AttributeError: partially initialized module 'view' has no attribute 'InputBoxTemplate' (most likely due to a circular import)

Code, Programmiersprache, Python, Python 3, Objektorientierte Programmierung, Tkinter, Pycharm

Python programmieren, Objektorientierte Programmierung in verschiedenen Dateien mit Klassen?

Hey,

ich lerne aktuell Python und habe angefangen einen Chatbot zu programmieren.
Nun will ich anfangen mir anzugewöhnen in verschiedenen Dateien mit Objektorientierter Programmierung zu programmieren bzw. das erstmal zu lernen.
Mein Gedanke in meinem Code ist z.B. eine Klasse WindowTemplate zu erstellen und diese als Blaupause ohne vorgegebene Werte zu definieren.
An Sich gelingt mir das auch aber ich habe Probleme von einer anderen Klasse aus einer anderen Datei darauf zuzugreifen und die Werte für wie zum Beispiel Größe oder Titel zu übergeben.
Ich würde mich freuen wenn hier mal jemand der etwas Erfahrung hat drauf schauen könnte und mich zumindest mal in die richtige Richtung leiten kann. :)
Viele Dank!

main.py

Fehlermeldung ist diese:

Traceback (most recent call last):

line 17, in <module>

  app = Main()

     ^^^^^^

line 9, in __init__

  self.main_window.set_size("1680", "900")

line 10, in set_size

  self.window_size.geometry(f"{width}x{height}")

  ^^^^^^^^^^^^^^^^^^^^^^^^^

AttributeError: 'NoneType' object has no attribute 'geometry'

import view
import customtkinter as ctk


class Main(ctk.CTk):
    def __init__(self):
        super().__init__()
        self.main_window = view.WindowTemplate()
        self.main_window.set_size("1680", "900")
        self.main_window.set_title("YourTerminal")

    def my_mainloop(self):
        self.mainloop()


if __name__ == "__main__":
    app = Main()
    app.my_mainloop()

view.py

import customtkinter as ctk


class WindowTemplate:
    def __init__(self, window_size=None, window_title=None):
        self.window_size = window_size
        self.window_title = window_title

    def set_size(self, width, height):
        self.window_size.geometry(f"{width}x{height}")

    def set_title(self, title):
        self.window_title.title(title)
Code, Programmiersprache, Python, Python 3, Objektorientierte Programmierung, Tkinter, Pycharm

Wie React Icons ausfüllen / Alternative?

In meiner React Component (siehe unten) ist leider das Icon ArrowUpCircleSharp von "react-icons" innen unausgefüllt was nicht schön aussieht wenn es sich über Text und Bilder bewegt, andere Icons wie von FontAwesome Material Icons haben das gleiche Problem. Ich habe es versucht mit den Props Stroke, Fill und mit CSS background, ändert aber nur das Schwarze außen und nicht innerhalb vom Icon.
Was kann ich tun ? Will jetzt nicht umbedingt eine ganze Library einbinden für das Icon, bei react-icons hab ich den Vorteil das es nur die benutzen auch wirklich nutzt,

'use client';
import { useEffect, useState } from "react";
import "../.././assets/styles/components/ScrollToTop/ScrollToTop.scss";
import { IoArrowUpCircleSharp} from "react-icons/io5";


export const ScrollToTop = () => {

const [ScrollY,setScrollY] = useState<number>(0);

useEffect(() => {
    window.addEventListener("scroll",() => setScrollY(document.documentElement.scrollTop))

    return () => {
        window.addEventListener("scroll",() => setScrollY(document.documentElement.scrollTop))
    }
}, [ScrollY])

    return(

        <div
            onClick={()=>{ScrollY > 100 ?
            window.scrollTo({
                behavior : "smooth",
                left : 0,
                top : 0})
            :
            window.scrollTo({
                behavior : "smooth",
                left : 0,
                top : document.body.scrollHeight});
            }}
        className={`ScrollToTop ${ScrollY > 100 ? " ScrollToTop_Up" : "ScrollToTop_Down"}`}>
                <IoArrowUpCircleSharp/>
        </div>
    )
}
Bild zum Beitrag
App, HTML, Webseite, programmieren, CSS, JavaScript, Informatik, Programmiersprache, Webentwicklung, Frontend, React, node

JavaScript Preis Calculator?

document.addEventListener('DOMContentLoaded', function() {
    const slider = document.getElementById('diskspace');
    const hiddenValue = document.getElementById('initialDiskspace');
    const demo = document.getElementById('demo');
    const selectedValue = document.getElementById('diskspaceOutput');
    const selectedPrice = document.getElementById('priceOutput');
    const initialDiskspaceValue = parseInt(new URLSearchParams(window.location.search).get('value')) || 0;

    // Setze den initialen Speicherplatz
    hiddenValue.value = initialDiskspaceValue;

    // Variable für den aktuellen Preis
    let currentPrice = 10; // Startpreis

    // Funktion zur Berechnung des Preises
    const calculatePrice = (value) => {
        // Grundpreise
        const basePrice = 10; // Grundpreis für den Server
        const pricePerGB = 1; // Preis pro GB Speicher
        const pricePerCPU = 1; // Preis pro CPU-Kern

        // Eingabewerte holen
        const diskspace = parseInt(value); // Speicherplatz in GB
        const cpuCores = parseInt(document.getElementById('cpu').value); // Anzahl der CPU-Kerne
        const os = document.getElementById('os').value; // Betriebssystem

        // Betriebssystem-Aufschläge (hier Beispiel, wie man unterschiedliche Preise je nach Betriebssystem anwenden könnte)
        let osPrice = 0;
        if (os === 'windows') {
            osPrice = 5; // Beispiel: Windows ist teurer
        } else if (os === 'macos') {
            osPrice = 10; // Beispiel: macOS ist noch teurer
        }

        // Berechne den Gesamtpreis
        const totalPrice = basePrice + (diskspace * pricePerGB) + (cpuCores * pricePerCPU) + osPrice;

        // Aktualisiere den angezeigten Preis
        selectedPrice.innerText = `Gesamtpreis: ${totalPrice.toFixed(2)} €`;

        return totalPrice;
    };

    // Setze den initialen Wert und Preis
    selectedValue.innerText = slider.value;
    calculatePrice(parseInt(slider.value));

    // Event Listener für Änderungen am Slider
    slider.oninput = function() {
        selectedValue.innerText = this.value;
        calculatePrice(parseInt(this.value));
    };

    // Formularabsenden mit verstecktem Wert und Preis
    const form = document.querySelector('form');
    form.addEventListener('submit', function(event) {
        event.preventDefault();
        hiddenValue.value = slider.value;
        this.submit();
    });
});

Hey das ist der Code uns er funktioniet nicht also nicht ganz richtig. Die rechnung ist falsch undzwar klappt nicht das 1GB Festplatte = 1€, 1GB Ram = 1€ und 1 Kern = 1€. und das dann einfach addiert wird das funktioniert nicht kann wer helfen? Es ust eine Website

Webseite, JavaScript, Programmiersprache

PHP/Passwortvergleich: Warum kommt immer wieder eine Fehlermeldung?

Hallo!

Ich will ein Passwort, das eingegeben wird, vergleichen. Doch es kommt immer wieder diese Fehlermeldung:

Eingegebenes Passwort: n1234
admin:238 Benutzername: nadine
admin:242 Uncaught ReferenceError: form is not defined
  at validatePassword (admin:242:18)
  at HTMLButtonElement.onclick (admin:161:100)

Der Code im AdminController sieht so aus:

public function validatePassword(Request $request, $userName) {
  try {
    $password = $request->input('password');

    // Benutzer anhand des Benutzernamens finden
    $user = User::where('username', $userName)->first();

    // Debugging-Informationen in das Log schreiben
    \Log::info('Benutzername: ' . $userName);
    \Log::info('Benutzer gefunden: ' . ($user ? 'Ja' : 'Nein'));

    if (!$user) {
      return response()->json(['valid' => false, 'message' => 'Benutzer nicht gefunden']);
    }

    // Überprüfen, ob das gespeicherte Passwort im Bcrypt-Format ist
    $passwordInfo = password_get_info($user->password);
    \Log::info('Passwort-Algorithmus: ' . $passwordInfo['algoName']);

    if ($passwordInfo['algoName'] !== 'bcrypt') {
      return response()->json(['valid' => false, 'message' => 'Das gespeicherte Passwort verwendet nicht den Bcrypt-Algorithmus.']);
    }

    // Passwortüberprüfung
    $passwordCheck = Hash::check($password, $user->password);
    \Log::info('Passwort korrekt: ' . ($passwordCheck ? 'Ja' : 'Nein'));

    if ($passwordCheck) {
      return response()->json(['valid' => true]);
    }
    else {
      return response()->json(['valid' => false, 'message' => 'Ungültiges Passwort']);
    }
  }
  catch (\Exception $e) {
    \Log::error('Fehler bei der Passwortvalidierung: ' . $e->getMessage());
    return response()->json(['valid' => false, 'message' => 'Serverfehler. Bitte versuchen Sie es später erneut.'], 500);
  }
}

Und im admin blade so:

function showPasswordModal(route, userName) {
  console.log('showPasswordModal() wurde aufgerufen mit Route:', route);
  $('#passwordModal').modal('show');
  $('#passwordForm').attr('action', route); // Setze die Aktion des Passwort-Formulars auf die gewählte Route
  $('#passwordForm').data('userName', userName);
  console.log(userName);
}

function validatePassword() {
  console.log('validatePassword() wurde aufgerufen');
  var enteredPassword = document.getElementById('passwordInput').value;
  var userName = $('#passwordForm').data('userName');
  console.log('Eingegebenes Passwort:', enteredPassword);
  console.log('Benutzername:', userName);

  $.ajax({
    type: 'POST',
    url: form.action,//$('#passwordForm').attr('action'), // Stellen Sie sicher, dass dies die richtige Route ist
    data: {
      '_token': '{{ csrf_token() }}',
      'password': enteredPassword
    },
    success: function(response) {
      console.log('Server-Antwort:', response);

      if (response.valid) {
        $('#payForm').submit();
      }
      else {
        alert(response.message || 'Falsches Passwort! Bitte versuche es erneut.');
      }
    },
    error: function(xhr, status, error) {
      console.error('AJAX-Fehler:', error);
      alert('Fehler beim Validieren des Passworts. Bitte versuche es später erneut.');
    }
  });

Warum kommt immer wieder eine Fehlermeldung? Ich habe schon alles probiert und das schon seit Stunden! Danke.

HTML, JavaScript, Code, PHP, Programmiersprache

wie bekomme ich in google Docks Tabelle zwei button mit abstand nebneinander?

Hallo in die Runde und schon mal vielen Dank im Voraus in die Runde!

Ich bin noch blutiger Anfänger und fange gerade an mich mit dem HTML zu beschäftigen. Wie schon im Fragetitel beschrieben versuche ich zwei Buttons mit Abstand nebeneinander zu bekommen, aber es gelingt mir nicht so recht. Daher setze ich mal das, was ich habe, hier rein. Ich würde mich über jeden lehrreichen Tipp sehr freuen, um meinen Horizont in diesem Bereich zu erweitern

<!DOCTYPE html>
<html>
<head>
<style>
.button {
  border: none;
  color: white;
  text-align: center;
  text-decoration: none;
  
  font-size: 16px;
  margin: 4px 2px;
  transition-duration: 0.4s;
  cursor: pointer;
}
form {
    background-color: #fff;
    width: 250px;
    padding: 10px;
    border-radius: 20px;
    box-shadow: 0px 0px rgba(1,2,0.1);
    margin
    width:auto !important;
}
    label {
    font-weight: bold;
    text-transform: uppercase;
}
    input[type="text"] {
    width: 250px;
    padding: 20px;
    margin-bottom: 9px;
    border: 1px outset #FF0000;
    border-radius: 10px;
    box-sizing: border-box;
}
    input[type="button"] {
    display: block;
    margin: 0 auto 12px auto;
    cursor: pointer;
    width: 190px;
    padding: 20px 2px;
    background-color: #FF0000;
    color: white;
    text-transform: uppercase;
    font-weight: bold;
    text-align: center;
    text-decoration: none;
    border: 1px solid #FF0000;
    border-radius: 7px;
 
    transition: background 0.2s ease-out;
 
}
    input[type="button1"] {
    display: block;
    margin: 0 auto 7px auto;
    cursor: pointer;
    width: 140px;
    padding: 20px 2px;
    background-color: #FF0000;
    color: white;
    text-transform: uppercase;
    font-weight: bold;
    text-align: center;
    text-decoration: none;
    border: 1px solid #FF0000;
    border-radius: 7px;
 
    transition: background 0.2s ease-out;
 
}
    input[type="button1"]:hover {
    background-color: #19911b;
}
 
    input[type="button"]:hover {
    background-color: #19911b;
}
 
</style>
</head>
<body>
<form id="itemForm">
<label for="sku">SKU:</label><br>
<input type="text" id="sku" name="sku"><br>
<label for="color">Color:</label><br>
<input type="text" id="color" name="color"><br>
<label for="size">Size:</label><br>
<input type="text" id="size" name="size"><br>
<label for="description">Description:</label><br>
<input type="text" id="description" name="description"><br><br>
<input type="button" value="Submit" onclick="submitForm()">
<input type="button1" value="Reset" onclick="form.reset()">
</form>
<script>
function submitForm() {
var form = document.getElementById('itemForm');
var formData = {
'sku': form.sku.value,
'color': form.color.value,
'size': form.size.value,
'description': form.description.value
};
google.script.run.processForm(formData);
}
</script>
</body>

</html>


Bild zum Beitrag
HTML, CSS, JavaScript, HTML5, Code, Programmiersprache

Code funktioniert nicht?

Der Code an sich ist etwas länger, aber diese Stelle scheint nicht zu funktionieren.
private List<string> SelectFiles(List<string> fileList)

{

  _logger.Log("Bitte geben Sie die Nummern der Handbücher ein, die Sie verarbeiten möchten (kommagetrennt, z.B. 1, 3-5), oder drücken Sie Enter, um alle zu verarbeiten:");

  string input = Console.ReadLine();

  List<string> selectedFiles = new List<string>();

  if (string.IsNullOrEmpty(input))

  {

    // Wenn keine Auswahl getroffen wurde, alle Dateien verarbeiten

    selectedFiles = fileList;

  }

  else

  {

    // Verarbeite die ausgewählten Nummern und Bereiche

    string[] inputParts = input.Split(',');

    HashSet<int> indices = new HashSet<int>();

    foreach (string part in inputParts)

    {

      if (part.Contains('-'))

      {

        string[] rangeParts = part.Split('-');

        if (rangeParts.Length == 2 &&

          int.TryParse(rangeParts[0].Trim(), out int start) &&

          int.TryParse(rangeParts[1].Trim(), out int end))

        {

          for (int i = start; i <= end; i++)

          {

            indices.Add(i);

          }

        }

      }

      else if (int.TryParse(part.Trim(), out int index))

      {

        indices.Add(index);

      }

    }

    foreach (int index in indices)

    {

      if (index > 0 && index <= fileList.Count)

      {

        selectedFiles.Add(fileList[index - 1]);

      }

    }

  }

  return selectedFiles;

}
Da fehlt sehr sehr viel beim Code, aber es geht um die Eingabe. Ich gebe ein:
1,2,4-6,3 Aber er macht nur was mit 1 2 3 udn 4 bis 6 lässt er weg, warum?

C Sharp, Code, Programmiersprache

Ersatz für delay(); in einem Arduino Nano gesucht?

ich benötige einen Ersatz für Delay, der die Ausführung von Subroutinen nicht behindert.

Es geht mir dabei nicht um das Blinken einer LED, sondern um die exakte Taktung mit der void loop() wiederholt wird.

hat hier jemand eine schlaue Idee

void loop() {
DateTime now = rtc.now();


// Delay-Ausgleich für den Countdown
if (Timer == 0) {
  Timer = Countdown;
  }
if (timeshift < 4)
  {
  timeshift++;
  }
else
  {
 timeshift = 0; 
 Timer--;
  }
Temperatur = rtc.getTemperature();
Temperatur = (float)Temperatur;


//Sonnenrichtungssensoren auslesen
LDR_up = analogRead(A0) + 20; // Sensorkalibrierung
LDR_west = analogRead(A2) + 45;  // Sensorkalibrierung
LDR_east = analogRead(A3); 
LDR_down = analogRead(A3);
Gesamtwert = LDR_up + LDR_west + LDR_east + LDR_down; // Gesamtmenge Licht

if (Helligkeitsglaettung > 0)
  {
  smooth_lumen();
  }
else
  {
  GM_Lumen = round(Gesamtwert / 10)*10;
  }

//Zeitformatierung Countdown
hours = floor(Timer/3600);
minutes = floor(Timer/60-(hours*60));
seconds = floor(Timer-((hours*3600)+(minutes*60)));

//Potiprozent berechnen
Potentiometerwert = analogRead(A6);
Potentiometerdifferenz = Potentiometerwert - Potentiometerminimum;
Potentiometerproz = 50.0 / Potentiometermax * Potentiometerdifferenz;
Potentiometeranz = 100 - (int)Potentiometerproz;

// Hinweise zur Richtungssteuerung:
 // digitalWrite(RELAISX, HIGH); // LOW = nach Osten HIGH = nach Westen
 // digitalWrite(RELAISZ, LOW); // LOW = nach Oben / HIGH = nach Unten

//  digitalWrite(RELAIS_PowerX, LOW); // LOW = Power On / HIGH = Power off
//  digitalWrite(RELAIS_PowerZ, LOW); //LOW Power On / HIGH = Power off

anemometer(); // Anemometer auswerten

// Wetter- und Lichtabhängiger Algorithmus für die Solarsteuerung
if (now.hour() == 3 && now.minute() == 0 && now.second() == 0) // Zeitpunkt für Korrektur der horizontalen 0-Position
  {
  angel_reset = 1;
  }
if (Temperatur > Mindesttemperatur)
  {
  if (Windmaximum < rpm)
    {
    storm_protection();
    }
  else if(angel >= -30 && angel_reset == 1)
    {
    angle_reset();
    }  
  else if (GM_Lumen < Mindesthelligkeit) 
    {// zu wenig Licht - die Anlage soll in die Neutralstellung fahren
    neutral_position();
    }
  else // Nachfuehrung im Normalbetrieb
    {
    solar_move();
    }
  }
// Anzeige für HD44780 2004 LCD (i2c) Display formatieren
show_display();
delay(200);
}
Arduino, Code, Programmiersprache, Zeit, Delay, Taktung

Funktionierender regulärer Ausdruck (CMD) um aus einer Textdatei bestimmte Zeilen mit " zu entfernen?

Eigentlich könnte man ja meinen, dass dieses Problem recht leicht zu lösen sein müsste. 

Aber aus irgendwelchen Gründen ist es das nicht, da " irgendwie für alles einen Sonderstatus hat. 

Also was ich gerne wissen würde: 

 Wie bzw. mit welchem regulären Ausdruck kann man (z.b mit einem Grepbefehl?) alle Zeilen suchen, die mit einem " anfangen ohne, dass dies zu unerwarteten Verhalten führt und z.b der Pfad nicht mehr gefunden wird bzw. keine Ausgabedatei erzeugt wird?  

 Ich hab es jetzt bereits mit dutzenden verschiedensten Varianten versucht: grep '^"' grep '^\"' grep -E '^\"' grep '^\".*' 

und noch X weiteren Variationen, aber entweder werden einfach nur alle Zeilen ausgegeben, die irgendwo im Text ein " enthalten oder es gibt Probleme mit der Erzeugung der Ausgabedatei.

Wichtig wäre in diesem Fall jedoch, dass nur der Anfang (erste Charakter) einer Zeile überprüft bzw. gematched werden soll. Scheinbar soll dies bei Grep ja mit ^ möglich sein und ein Escapen der " mit \. Funktioniert aber alles nicht!

GPT hab ich auch schon gefragt, aber der Bot ist mit der Frage komplett überfordert und gibt nur hanebüchenen Mist aus, der entweder nicht funktioniert oder sehr langsam ist (z.b Ansätze mit Powershell)

Also bevor ich jetzt noch meinen kompletten PC / CPU zu Schrott fahre: Gibt es eine effektive und schnelle Möglichkeit wie man diese Operation aus einer Textdatei alle Zeilen ohne " am Anfang = delete (möglichst mit verfügbaren Onboardmitteln) ausführen kann und falls ja wie?  

Im Idealfall sollten die Zeilen, die nicht gematched werden auch einfach direkt aus der Datei herausgelöscht werden können, anstatt jedesmal den kompletten Inhalt zu kopieren.

Irgendein Tipp?

PC, IT, programmieren, Batch, Batchprogrammierung, cmd, Code, Programmiersprache, Textbearbeitung, PowerShell, Regulärer Ausdruck, Windows 10, CMD Befehl

Richtige ARIA - Accessibility Auszeichnungen?

Heute geht es mir um eine korrekte ARIA - Accessibility Auszeichnung:

A) Die (TAB) Skip- Links

<!-- Skip links -->
<nav role="navigation" aria-label="skiplinks" id="skiplinks">
	<a href="#main-content" class="skip-link">Zum Haupt&shy;inhalt springen</a>
	<a href="#totop" class="skip-link">Zum Skip&shy;button springen</a>
	<a href="#foot-global"class="skip-link">Zum Footer springen</a>
</nav>

B) Meine Haupt - Navigation

<!-- HAUPT - Navigation -->
<nav id="main-nav" aria-label="MainNav">
  <details id="site-nav-heading">
	<summary aria-labelledby="site-nav-heading">Haupt-&shy;Navigation</summary>
	  <ul aria-labelledby="site-nav-heading">
		<li><a href="">Website Erika Mustermann</a></li>
		<li><a href="">Blog Max Mustermann</a></li>
	  </ul>
  </details>
</nav>

C) Ein INTERNES SKIPPEN zu einzelnen BLOG-ARTIKELN (geordnet nach Datum & Uhrzeit

<nav id="navigations" class="" aria-labelledby="skiptosection-label">
<h3 id="skiptosection-label" class="visually-hidden">Intern-Site-Navigation</h3>
<div class="skipsection-links">
<details>
	<summary class="site-navigation-header">Inhalt</summary>					
		<ul class="site-nav-skiplinks">
			<li><a href="#blogartikel05">20-02-2024<span>13:00 Uhr</span></a></li>
			<li><a href="#blogartikel04">12-02-2024<span>14:30 Uhr</span></a></li>
		</ul>
</details>
</div>
</nav>

D) Zum Schluss noch der Nach-OBEN (SKIP - to - Top) Button

<!-- SKIP - to TOP LINK -->	
<nav id="skiptop" aria-labelledby="skiptop-label" class="scroll-top-wrapper">
<h2 class="visually-hidden">Skip-to-TOP</h2>
	<div id="skiptop-label" class="scroll-top_link">
		<a href="#skip-to-top"><span>skip to top</span></a>
	</div>
</nav>

Bitte das mal zu korregieren.

HTML, Webseite, HTML5, Code, Programmiersprache, Webdesign, Webentwicklung

Bashskript Problem?

Ich habe hier ein Bashskript, welches Dateien überwacht (noch nicht vollständig und absolut unoptimiert). Ich weiß, dass es Tools gibt, aber es ist ein Projekt für die Uni und deshalb ist Optimierung und Effizienz nicht wirklich wichtig. Ich möchte damit die Grundlagen des Shellscriptings einfach etwas lernen.

Das ist bisher das Script:

#!/bin/bash


echo "Das Skript wurde gestartet. Der Typ Ihres Betriebssystem ist "\"$OSTYPE\""."


# If-Abfrage, die das Betriebssystem erkennt und den Pfad zum überwachten Ordner oder Datei festlegt # HIER BITTE DIE PFADE ZUM ZU ÜBERWACHENDEN ORDNER EINTRAGEN   
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
    BASE_DIRECTORY=" " # Übergibt dem überwachten Ordner eine Variable, wenn Betriebssystem = Linux
elif [[ "$OSTYPE" == "darwin"* ]]; then
    BASE_DIRECTORY="/Users/name/Library/CloudStorage/GoogleDrive-email@gmail.com/Meine Ablage/Uni/TestOrdner" # Übergibt dem überwachten Ordner eine Variable, wenn Betriebssystem = MacOs
elif [[ "$OSTYPE" == "win32" || "$OSTYPE" == "msys" || "$OSTYPE" == "cygwin" ]]; then
    BASE_DIRECTORY="/g/Meine Ablage/Uni/TestOrdner" # Übergibt dem überwachten Ordner eine Variable, wenn Betriebssystem = Windows
else    
    echo "Das Betriebssystem ist unbekannt." # Wenn das Betriebssystem unbekannt ist, wird eine Fehlermeldung ausgegeben
    exit 1
fi


DIRECTORY="$BASE_DIRECTORY" # Pfad zum Ordner
FILE="$BASE_DIRECTORY/Datei.txt" # Pfad zur Datei   
FILE2="$BASE_DIRECTORY/Datei2.txt" # Pfad zur Datei2 


cd "$BASE_DIRECTORY" || {
    echo "Wechsel zu $BASE_DIRECTORY fehlgeschlagen!" # Wechselt in den TestOrdner oder gibt eine Fehlermeldung aus
    exit 1;
}



# Funktion, um zu überprüfen, ob Dateien gelöscht wurden
checkIfDeleted() {
    if [ ! -f "$FILE" ]; then 
        echo "Die Datei \"$(basename "$FILE")\" wurde gelöscht, umbenannt oder verschoben."
    elif [ ! -f "$FILE2" ]; then
        echo "Die Datei \"$(basename "$FILE2")\" wurde gelöscht, umbenannt oder verschoben."
    elif [ ! -d "$DIRECTORY" ]; then
        echo "Der Ordner \"$(basename "$DIRECTORY")\" wurde gelöscht, umbenannt oder verschoben."
    fi
}


# Speichert den "ursprünglichen" Hash-Wert der Dateien
ORIGINAL_HASH=$(md5 -q "$FILE")
ORIGINAL_HASH2=$(md5 -q "$FILE2")


checkIfEdited() {
    if [ ! -f "$FILE" ]; then # Wenn $FILE nicht existiert, dann wird das Skript hier beendet
    return
    fi


    if [ ! -f "$FILE2" ]; then # Wenn $FILE2 nicht existiert, dann wird das Skript hier beendet
    return
    fi


    if [ ! -d "$DIRECTORY" ]; then # Wenn $DIRECTORY nicht existiert, dann wird das Skript hier beendet
    return
    fi


    # Berechnet den aktuellen Hash-Wert der Dateien
    CURRENT_HASH=$(md5 -q "$FILE")
    CURRENT_HASH2=$(md5 -q "$FILE2")


    # Hash-Werte werden verglichen
    if [ "$CURRENT_HASH" != "$ORIGINAL_HASH" ]; then
        echo "Die Datei \"$(basename "$FILE")\" wurde bearbeitet."
        # Ursprünglicher Hash-Wert wird für zukünftige Überprüfungen aktualisiert
        ORIGINAL_HASH="$CURRENT_HASH"
    elif [ "$CURRENT_HASH2" != "$ORIGINAL_HASH2" ]; then
        echo "Die Datei \"$(basename "$FILE2")\" wurde bearbeitet."
        # Ursprünglicher Hash-Wert wird für zukünftige Überprüfungen aktualisiert
        ORIGINAL_HASH2="$CURRENT_HASH2"
    fi
}


while true; do # Endlosschleife, die die Funktionen "checkIfDeleted" und "checkIfEdited" alle 10 Sekunden ausführt
    checkIfDeleted
    checkIfEdited
    sleep 10
done

Ja, ich weiß, welche Probleme das Skript mit sich bringt, aber ich habe ein anderes Problem:

Wenn jemand das Skript nutzen möchte, muss er die Pfade seiner Dateien einfügen und sogar neue Variablen definieren.

Man könnte das doch so machen, dass das Skript die Liste des Ordners einliest und dann auf alle Dateien direkt zugreifen muss, ohne dass man sie in das Skript einfügen muss.

Also irgendwie mit dem Befehl "ls". Ich weiß aber nicht, wie ich das implementieren soll.

Kann mir wer helfen bitte?

Visual Basic, Linux, HTML, Webseite, VBA, Bash, Batch, cmd, Code, lua, MySQL, PHP, Programmiersprache, Python, Script, Python 3

Meistgelesene Beiträge zum Thema Programmiersprache