kleine Mathe-Spielereien

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
nezzcarth
User
Beiträge: 1736
Registriert: Samstag 16. April 2011, 12:47

Die Codebeispiele waren nicht von mir.
OSWALD
User
Beiträge: 547
Registriert: Freitag 18. März 2022, 17:32

17,7,23
Ich muss mich bei grubenfox und nezzcarth vielmals entschuldigen.
Das besagte Programm stammt von grubenfox.
Umso herzlicher mein Dank an beide Helfer.

Gute Zeit OSWALD
OSWALD
User
Beiträge: 547
Registriert: Freitag 18. März 2022, 17:32

18.07.2023
ein weiteres Beispiel zeigt die große Bandbreite an
Möglichkeiten mit den zahlreichen Funktionen der ZIP-Bibliothek.
Gute Zeit OSWALD

Code: Alles auswählen


#RICHTOTAL.py
from rich.align import Align
from rich.console import Console
from rich.live import Live
from rich.table import Table
 
TABLE_DATA = [
    [
        "[b white]PYTHON  KURS [/]: [i]für Anfänger[/]",
        "[magenta]ausgebucht",
        "[green]TU München[/]",
        "demnächst",
    ],
    [
        "[b white]SCIPY KURS[/]: [i]für Interessierte[/]",
        "[yellow][/]ausgebucht",
        "[green] UNI Franfurt[/]",
        "2024",
    ],
    [
        "[b white]DSA Course[/]: [i für ]Fortgeschrittene[/]",
        "[magenta] noch 20 Plätze frei",
        "[green] MTI Boston[/]",
        "2024",
    ],
    [
        "[b white]Operating System für Profis[/]",
         "[magenta]    keine Angaben",
        "[green ]wird demnächst bekannt  gegeben[/]",
        "unbekannt",
    ],
]
 
console = Console()
table = Table(show_footer=False)
table_centered = Align.center(table)
console.clear()
 
with Live(table_centered, console=console,
          screen=False):
    table.add_column("Kursbezeichnug", no_wrap=True)
    table.add_column("belegt / frei", no_wrap=True)
    table.add_column("Organisation", no_wrap=True)
    table.add_column("Zeitpunkt", no_wrap=True)
    table.add_column("Ein Test mit RICH-CODE", no_wrap=True)

    for row in TABLE_DATA:
        table.add_row(*row)
 
    table_width = console.measure(table).maximum
    table.width = None


OSWALD
User
Beiträge: 547
Registriert: Freitag 18. März 2022, 17:32

20.07.23
Aus der umfangreichen RICH-Library noch ein Beispiel,
hier etwas verändert
Gute Zeit OSWALD

Code: Alles auswählen





#  RICHTABLEA.py

import time

from rich.live import Live
from rich.table import Table

table = Table()
table.add_column("Row ID")
table.add_column("Description")
table.add_column("Level")

with Live(table, refresh_per_second=4):  # update 4 times a second to feel fluid
    for row in range(20):
        time.sleep(0.4)  # arbitrary delay
        # update the renderable internally
        table.add_row(f"{row}", f"Beschreibung {row}", "[red]größer o. kleiner?")
#Aktualisieren des Renderables¶
#Sie können das Renderbare auch im laufenden Betrieb ändern, indem Sie die update()Methode aufrufen. Dies kann nützlich sein, wenn die Informationen, die Sie anzeigen möchten, zu dynamisch sind, um sie durch Aktualisieren eines einzelnen Renderables zu generieren. Hier ist ein Beispiel:

import random
import time

from rich.live import Live
from rich.table import Table


def generate_table() -> Table:
    """Make a new table."""
    table = Table()
    table.add_column("ID")
    table.add_column("Value")
    table.add_column("Status")

    for row in range(random.randint(2, 6)):
        value = random.random() * 100
        table.add_row(
            f"{row}", f"{value:3.2f}", "[red] Kleiner als 80 : Falsch" if value < 80 else "[green]Größer als 80  Richtig"
        )
    return table


with Live(generate_table(), refresh_per_second=4) as live:
    for _ in range(40):
        time.sleep(0.4)
        live.update(generate_table())




OSWALD
User
Beiträge: 547
Registriert: Freitag 18. März 2022, 17:32

20,07.23
Und zum Schluss noch ein "'RICH-LAYOUT"
zur Weiterbearbeitung
OSWALD

Code: Alles auswählen

#RICHLAYOUT.py


from rich import print
from rich.layout import Layout

layout = Layout()
print(layout)
 
layout.split_column(
    Layout(name="upper"),
    Layout(name="lower")
)
print(layout)
layout["lower"].split_row(
Layout(name="left"),
Layout(name="right"),
)
print(layout)





OSWALD
User
Beiträge: 547
Registriert: Freitag 18. März 2022, 17:32

27.o7.2023
Ich habe mich inzwischen ausführlich
mit RICH beschäftigt und bin an RICH.LAYOUT
quasi hängengeblieben. Es ist der schwierigste Teil von RICH.
Als NONPLUSTLTRA fand ich im Netz folgenden CODE.
Diesen habe ich als Testlabor vielfach verändert und weitgehend verstanden.
NB: Im Net wir als 'besserer Konkurrent' hieß empfohlen.
TEXTUAL. Hier meine Version von RICH,LAYUT;

Code: Alles auswählen


#Richtextlayout.py

from rich import print
from rich.panel import Panel
from rich.layout import Layout
from rich.prompt import Prompt

def rich_ui():
    while True:
        layout = Layout()
        layout.split_column(
            Layout(name="banner"),
            Layout(name="recipe" ),
            Layout(name="search")
        )

        layout['banner'].update(Panel('Brot backen', padding=1))
        layout['banner'].size = 5

        layout['recipe'].split_row(
            Layout(name="Zutaten:\
            Roggenmehl,\
            Dinkelmehl,\
            Weizenmeh,\
            Salz und Wasser"),
            Layout(name="Herstellung:\
           Teig zubereiten,\
            bei 230° 1 Stunde backen.")      
                   
        )

        layout['search'].update(Panel(Prompt.ask('> '), title='Suche nach einem Rezept'))
        layout['search'].size = 5
        print(layout)

if __name__ == '__main__':
    rich_ui()


Benutzeravatar
__blackjack__
User
Beiträge: 13933
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Die Ausgabe von dem Code sieht ja irgendwie nicht so sinnvoll aus:

Code: Alles auswählen

│                                                                              │
│ Brot backen                                                                  │
│                                                                              │
╰──────────────────────────────────────────────────────────────────────────────╯
╭─ 'Zutaten:            Roggenmehl,   ─╮╭─ 'Herstellung:           Teig zubere─╮
│                                      ││                                      │
│                                      ││                                      │
│                                      ││                                      │
│ Layout(                              ││                                      │
│     name='Zutaten:                   ││ Layout(                              │
│ Roggenmehl,            Dinkelmehl,   ││     name='Herstellung:               │
│ Weizenmeh,            Salz und       ││ Teig zubereiten,            bei 230° │
│ Wasser'                              ││ 1 Stunde backen.'                    │
│ )                                    ││ )                                    │
│                                      ││                                      │
│                                      ││                                      │
│                                      ││                                      │
│                                      ││                                      │
╰──────────────────────────────────────╯╰──────────────────────────────────────╯
╭────────────────────────── Suche nach einem Rezept ───────────────────────────╮
│ Hallo                                                                        │
│                                                                              │
│                                                                              │
╰──────────────────────────────────────────────────────────────────────────────╯
> : 
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
OSWALD
User
Beiträge: 547
Registriert: Freitag 18. März 2022, 17:32

29.07.23
Heute habe ich erstmalig eine Kombination von RICH und TEXTUAl
im Netz gefunden. Der Code läuft einwandfrei auf Python und
der Windows Eingabeaufforderung. Kein Wunder, stammt ja auch
vom gleichen Autor. Ich kann mit dem Textual-Teil gar nichts anfangen.
Trotzdem möchte ich das Produkt hier zeigen.
Ich würed gerne erfahren, ob es für mich sinnvoll ist, mich mit
Textual näher zu befassen. Bisher ist es mir auch noch nicht gelungen
Textual herunter zu laden.
Gute Zeit OSWALD

Code: Alles auswählen

mport time
from rich.progress import track

for _ in track(range(20), description="Processing..."):
    time.sleep(0.5)  # Simulate work being done

import time
from rich.progress import Progress

with Progress() as progress:
    _ = progress.add_task("Loading...", total=None)  
    while True:
        time.sleep(0.01)

 
from time import monotonic

from textual.reactive import reactive
from textual.widgets import Static


class TimeDisplay(Static):
    """A widget to display elapsed time."""

    start_time = reactive(monotonic)
    time = reactive(0.0)
    total = reactive(0.0)

    def on_mount(self) -> None:
        """Event handler called when widget is added to the app."""
        self.update_timer = self.set_interval(1 / 60, self.update_time, pause=True)     
    def update_time(self) -> None:
        """Method to update time to current."""
        self.time = self.total + (monotonic() - self.start_time)

    def watch_time(self, time: float) -> None:
        """Called when the time attribute changes."""
        minutes, seconds = divmod(time, 60)
        hours, minutes = divmod(minutes, 60)
        self.update(f"{hours:02,.0f}:{minutes:02.0f}:{seconds:05.2f}")


from rich.progress import Progress, BarColumn

from textual.app import App, ComposeResult
from textual.widgets import Static


class IndeterminateProgress(Static):
    def __init__(self):
        super().__init__("")
        self._bar = Progress(BarColumn())  
        self._bar.add_task("", total=None)  

    def on_mount(self) -> None:
        # When the widget is mounted start updating the display regularly.
        self.update_render = self.set_interval(
            1 / 60, self.update_progress_bar
        )  

    def update_progress_bar(self) -> None:
        self.update(self._bar)  


class MyApp(App):
    def compose(self) -> ComposeResult:
        yield IndeterminateProgress()


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


OSWALD
User
Beiträge: 547
Registriert: Freitag 18. März 2022, 17:32

2.8.23
Nach Umstieg auf Python 3.11.4 gab es einige
Probleme. Inzwischen konnte ich mich etwas in
das Thema - Textual - einarbeiten.
Offen ist aber immer noch die
Frage , wie ich den Z ugriff auf die erforderliche CSS-Datei
schaffe. Im konkreten Fall ist es eine "weather.CSS".
Hier der Code. Das Ergebnis weist auf die fehlende Datei hin.
Gute Zeit OSWALD

Code: Alles auswählen

#TestC.py


from urllib.request import Request, urlopen
from rich.text import Text

from textual import work
from textual.app import App, ComposeResult
from textual.containers import VerticalScroll
from textual.widgets import Input, Static
from textual.worker import Worker, get_current_worker


class WeatherApp(App):
    """App to display the current weather."""

    CSS_PATH = "weather.css"

    def compose(self) -> ComposeResult:
        yield Input(placeholder="Enter a City")
        with VerticalScroll(id="weather-container"):
            yield Static(id="weather")

    async def on_input_changed(self, message: Input.Changed) -> None:
        """Called when the input changes"""
        self.update_weather(message.value)

    @work(exclusive=True)
    def update_weather(self, city: str) -> None:
        """Update the weather for the given city."""
        weather_widget = self.query_one("#weather", Static)
        worker = get_current_worker()
        if city:
            # Query the network API
            url = f"https://wttr.in/{city}"
            request = Request(url)
            request.add_header("User-agent", "CURL")
            response_text = urlopen(request).read().decode("utf-8")
            weather = Text.from_ansi(response_text)
            if not worker.is_cancelled:
                self.call_from_thread(weather_widget.update, weather)
        else:
            # No city, so just blank out the weather
            if not worker.is_cancelled:
                self.call_from_thread(weather_widget.update, "")

    def on_worker_state_changed(self, event: Worker.StateChanged) -> None:
        """Called when the worker state changes."""
        self.log(event)


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


OSWALD
User
Beiträge: 547
Registriert: Freitag 18. März 2022, 17:32

8.8.23
Ohne HTML kein CSS.
Über PYTHON hinaus will und kann ich nicht gehen.
Aber wenn z.B. Textuas.stopwatch nicht funktioniert
geht es mit PYTHON
Und in Python gibt es für mich
noch eine Menge zu lernen.
Hier also der Code:
Gute Zeit OSWALD

Code: Alles auswählen

# Python program to illustrate a stop watch
# using Tkinter
#importing the required libraries
import tkinter as Tkinter
from datetime import datetime
counter = 66600
running = False
def counter_label(label):
    def count():
        if running:
            global counter
   
            # To manage the initial delay.
            if counter==    0:            
                display="Weiter......."
            else:
                tt = datetime.fromtimestamp(counter)
                string = tt.strftime("%H:%M:%S")
                display=string
   
            label['text']=display   # Or label.config(text=display)
   
            # label.after(arg1, arg2) delays by 
            # first argument given in milliseconds
            # and then calls the function given as second argument.
            # Generally like here we need to call the 
            # function in which it is present repeatedly.
            # Delays by 1000ms=1 seconds and call count again.
            label.after(1000, count) 
            counter +=1
   
    # Triggering the start of the counter.
    count()     
   
# start function of the stopwatch
def Start(label):
    global running
    running=True
    counter_label(label)
    start['state']='disabled'
    stop['state']='normal'
    reset['state']='normal'
   
# Stop function of the stopwatch
def Stop():
    global running
    start['state']='normal'
    stop['state']='disabled'
    reset['state']='normal'
    running = False
   
# Reset function of the stopwatch
def Reset(label):
    global counter
    counter= 0
   
    # If rest is pressed after pressing stop.
    if running==False:      
        reset['state']='disabled'
        label['text']='Es geht los!'
   
    # If reset is pressed while the stopwatch is running.
    else:               
        label['text']='J e t z t ........'
   
root = Tkinter.Tk()
root.title("Stoppuhr")
   
# Fixing the window size.
root.minsize(width=350, height=70)
label = Tkinter.Label(root, text="Willkommen   bei  Python", fg="red", font="Verdana 30 bold")
label.pack()
f = Tkinter.Frame(root)
start = Tkinter.Button(f, text='Start', width=6, command=lambda:Start(label))
stop = Tkinter.Button(f, text='Stop',width=6,state='disabled', command=Stop)
reset = Tkinter.Button(f, text='Reset',width=6, state='disabled', command=lambda:Reset(label))
f.pack(anchor = 'center',pady=5)
start.pack(side="left")
stop.pack(side ="left")
reset.pack(side="left")
root.mainloop()
 
OSWALD
User
Beiträge: 547
Registriert: Freitag 18. März 2022, 17:32

]5.8.23
Ein letztes(?) Experiment mit TEXTUAL, aber nun mit PYTHON
.Eine Kombination von TEXTUAL mit PYTHON
-hier mit stoppuhr.py läuft, tadellos mit der Eingabeaufforderung
von Windows. Der COde von 'OPTIMAL.py sollte bereits vorhanden sein.
Wie gesagt en Experiment, ohne zu fragen, ob das sinnvoll ist oder nicht.
Gute Zeit OSWALD

Code: Alles auswählen

#ORIGINAL.py
from rich.progress import Progress, BarColumn
from rich.spinner import Spinner
import PYTHONSTOPPUHR.py 
from textual.app import App, ComposeResult, RenderableType
from textual.containers import Grid, Horizontal, Vertical
from textual.widgets import Button, Static


class IntervalUpdater(Static):
    _renderable_object: RenderableType

    def update_rendering(self) -> None:
        self.update(self._renderable_object)

    def on_mount(self) -> None:
        self.interval_update = self.set_interval(1 / 60, self.update_rendering)

    def pause(self) -> None:  
        self.interval_update.pause()

    def resume(self) -> None:  
        self.interval_update.resume()


class IndeterminateProgressBar(IntervalUpdater):
    """Basic indeterminate progress bar widget based on rich.progress.Progress."""
    def __init__(self) -> None:
        super().__init__("")
        self._renderable_object = Progress(BarColumn())
        self._renderable_object.add_task("", total=None)


class SpinnerWidget(IntervalUpdater):
    """Basic spinner widget based on rich.spinner.Spinner."""
    def __init__(self, style: str) -> None:
        super().__init__("")
        self._renderable_object = Spinner(style)


class LiveDisplayApp(App[None]):
    """App showcasing some widgets that update regularly."""
    PYTHON_PATH = "C:/PYTJON310/PYTHONSTOPPUHR.py"
  

    def compose(self) -> ComposeResult:
        yield Vertical(
                Grid(
                    SpinnerWidget("moon"),
                    IndeterminateProgressBar(),
                    SpinnerWidget("aesthetic"),
                    SpinnerWidget("bouncingBar"),
                    SpinnerWidget("earth"),
                    SpinnerWidget("dots8Bit"),
                ),
                Horizontal(
                    Button("Pause", id="pause"),  
                    Button("Resume", id="resume", disabled=True),
                ),
        )

    def on_button_pressed(self, event: Button.Pressed) -> None:  
        pressed_id = event.button.id
        assert pressed_id is not None
        for widget in self.query(IntervalUpdater):
            getattr(widget, pressed_id)()  

        for button in self.query(Button):  
            if button.id == pressed_id:
                button.disabled = True
            else:
                button.disabled = False


LiveDisplayApp().run()

 

class IntervalUpdater(Static):
    # ...
    def update_rendering(self) -> None:
        self.update(self._renderable_object)
 
class IntervalUpdater(Static):
    _renderable_object: RenderableType

    def __init__(self, renderable_object: RenderableType) -> None:  
        super().__init__(renderable_object)  

    def on_mount(self) -> None:
        self.interval_update = self.set_interval(1 / 60, self.refresh)  

 
class Spinner:
    # ...

    def __rich_console__(
        self, console: "Console", options: "ConsoleOptions"
    ) -> "RenderResult":
        yield self.render(console.get_time())  

    # ...
    def render(self, time: float) -> "RenderableType":  
        # ...

        frame_no = ((time - self.start_time) * self.speed) / (  
            self.interval / 1000.0
        ) + self.frame_no_offset



OSWALD
User
Beiträge: 547
Registriert: Freitag 18. März 2022, 17:32

.8.23
Um Zufall auszuschliessen, gleich noch ein Versuch.
Dazu sind zwei Codes notwendig.
1. Oswald.py
2. ORIGINAL (Eingabeaufforerung
Gruss OSWALD

Code: Alles auswählen


######################################################

import OSWALD.py

from rich.progress import Progress, BarColumn
from rich.spinner import Spinner
 
from textual.app import App, ComposeResult, RenderableType
from textual.containers import Grid, Horizontal, Vertical
from textual.widgets import Button, Static


class IntervalUpdater(Static):
    _renderable_object: RenderableType

    def update_rendering(self) -> None:
        self.update(self._renderable_object)

    def on_mount(self) -> None:
        self.interval_update = self.set_interval(1 / 60, self.update_rendering)

    def pause(self) -> None:  
        self.interval_update.pause()

    def resume(self) -> None:  
        self.interval_update.resume()


class IndeterminateProgressBar(IntervalUpdater):
    """Basic indeterminate progress bar widget based on rich.progress.Progress."""
    def __init__(self) -> None:
        super().__init__("")
        self._renderable_object = Progress(BarColumn())
        self._renderable_object.add_task("", total=None)


class SpinnerWidget(IntervalUpdater):
    """Basic spinner widget based on rich.spinner.Spinner."""
    def __init__(self, style: str) -> None:
        super().__init__("")
        self._renderable_object = Spinner(style)


class LiveDisplayApp(App[None]):
    """App showcasing some widgets that update regularly."""
    PYTHON_PATH = "C:/oswald.py"
  

    def compose(self) -> ComposeResult:
        yield Vertical(
                Grid(
                    SpinnerWidget("moon"),
                    IndeterminateProgressBar(),
                    SpinnerWidget("aesthetic"),
                    SpinnerWidget("bouncingBar"),
                    SpinnerWidget("earth"),
                    SpinnerWidget("dots8Bit"),
                ),
                Horizontal(
                    Button("Pause", id="pause"),  
                    Button("Resume", id="resume", disabled=True),
                ),
        )

    def on_button_pressed(self, event: Button.Pressed) -> None:  
        pressed_id = event.button.id
        assert pressed_id is not None
        for widget in self.query(IntervalUpdater):
            getattr(widget, pressed_id)()  

        for button in self.query(Button):  
            if button.id == pressed_id:
                button.disabled = True
            else:
                button.disabled = False


LiveDisplayApp().run()

 

class IntervalUpdater(Static):
    # ...
    def update_rendering(self) -> None:
        self.update(self._renderable_object)
 
class IntervalUpdater(Static):
    _renderable_object: RenderableType

    def __init__(self, renderable_object: RenderableType) -> None:  
        super().__init__(renderable_object)  

    def on_mount(self) -> None:
        self.interval_update = self.set_interval(1 / 60, self.refresh)  
 
 
 
class Spinner:
    # ...

    def __rich_console__(
        self, console: "Console", options: "ConsoleOptions"
    ) -> "RenderResult":
        yield self.render(console.get_time())  

    # ...
    def render(self, time: float) -> "RenderableType":  
        # ...

        frame_no = ((time - self.start_time) * self.speed) / (  
            self.interval / 1000.0
        ) + self.frame_no_offset


################################################
####################################################


from tkinter import *
import subprocess
from subprocess import  *
from tkinter.filedialog import askopenfilename
 
def code1():
    subprocess.call(["C:/windows/system32/mspaint.exe"])
      
def code2():
     subprocess.call(["C:/windows/system32/calc.exe"])

def code3():
     subprocess.call(["C:/Program Files/Internet Explorer/iexplore.exe"])

def code4():
    subprocess.call( [ "C:\Program Files\Google\Chrome\Application\chrome.exe" ])                                                                   

  
def About():
    print("Beispiel  für ein Menue" )

window = Tk()
window.geometry("450x450")
window.title("Bitte wählen Sie aus dem Menue")
menu = Menu(window)
window.config(menu=menu)
filemenu = Menu(menu)
menu.add_cascade(label="File", menu=filemenu)
filemenu.add_command(label="P a i n t", command=code1)
filemenu.add_command(label= "C a l c  ", command=code2)
filemenu.add_command(label= "E x p l o r e " ,command  =code3)
filemenu.add_command(label= "G o o g l e" , command = code4)
  
 
filemenu.add_command(label="Exit", command=window.quit)

helpmenu = Menu(menu)
menu.add_cascade(label="Help", menu=helpmenu)
helpmenu.add_command(label="About...", command=About)

mainloop()


[/code
OSWALD
User
Beiträge: 547
Registriert: Freitag 18. März 2022, 17:32

Leider vergessen
der Code für STOPPUHR.py
Jetzt dürfte es klappen
Ich bitte um Entschuldigung.
Das Alter ?
Gruss OSWALD


Code: Alles auswählen



# Python program to illustrate a stop watch
# using Tkinter
#importing the required libraries
import tkinter as Tkinter
from datetime import datetime
counter = 66600
running = False  
# using Tkinter
#importing the required libraries
import tkinter as Tkinter
from datetime import datetime
counter = 66600
running = False
def counter_label(label):
    def count():
        if running:
            global counter
   
            # To manage the initial delay.
            if counter==    0:            
                display="Weiter......."
            else:
                tt = datetime.fromtimestamp(counter)
                string = tt.strftime("%H:%M:%S")
                display=string
   
            label['text']=display   # Or label.config(text=display)
   
            # label.after(arg1, arg2) delays by 
            # first argument given in milliseconds
            # and then calls the function given as second argument.
            # Generally like here we need to call the 
            # function in which it is present repeatedly.
            # Delays by 1000ms=1 seconds and call count again.
            label.after(1000, count) 
            counter +=1
   
    # Triggering the start of the counter.
    count()     
   
# start function of the stopwatch
def Start(label):
    global running
    running=True
    counter_label(label)
    start['state']='disabled'
    stop['state']='normal'
    reset['state']='normal'
   
# Stop function of the stopwatch
def Stop():
    global running
    start['state']='normal'
    stop['state']='disabled'
    reset['state']='normal'
    running = False
   
# Reset function of the stopwatch
def Reset(label):
    global counter
    counter= 0
   
    # If rest is pressed after pressing stop.
    if running==False:      
        reset['state']='disabled'
        label['text']='Es geht los!'
   
    # If reset is pressed while the stopwatch is running.
    else:               
        label['text']='J e t z t ........'
   
root = Tkinter.Tk()
root.title("Stoppuhr")
   
# Fixing the window size.
root.minsize(width=350, height=70)
label = Tkinter.Label(root, text="Willkommen   bei  Python", fg="red", font="Verdana 30 bold")
label.pack()
f = Tkinter.Frame(root)
start = Tkinter.Button(f, text='Start', width=6, command=lambda:Start(label))
stop = Tkinter.Button(f, text='Stop',width=6,state='disabled', command=Stop)
reset = Tkinter.Button(f, text='Reset',width=6, state='disabled', command=lambda:Reset(label))
f.pack(anchor = 'center',pady=5)
start.pack(side="left")
stop.pack(side ="left")
reset.pack(side="left")
root.mainloop()
def counter_label(label):
    def count():
        if running:
            global counter
   
            # To manage the initial delay.
            if counter==    0:            
                display="Weiter......."
            else:
                tt = datetime.fromtimestamp(counter)
                string = tt.strftime("%H:%M:%S")
                display=string
   
            label['text']=display   # Or label.config(text=display)
   
            # label.after(arg1, arg2) delays by 
            # first argument given in milliseconds
            # and then calls the function given as second argument.
            # Generally like here we need to call the 
            # function in which it is present repeatedly.
            # Delays by 1000ms=1 seconds and call count again.
            label.after(1000, count) 
            counter +=1
   
    # Triggering the start of the counter.
    count()     
   
# start function of the stopwatch
def Start(label):
    global running
    running=True
    counter_label(label)
    start['state']='disabled'
    stop['state']='normal'
    reset['state']='normal'
   
# Stop function of the stopwatch
def Stop():
    global running
    start['state']='normal'
    stop['state']='disabled'
    reset['state']='normal'
    running = False
   
# Reset function of the stopwatch
def Reset(label):
    global counter
    counter= 0
   
    # If rest is pressed after pressing stop.
    if running==False:      
        reset['state']='disabled'
        label['text']='Es geht los!'
   
    # If reset is pressed while the stopwatch is running.
    else:               
        label['text']='J e t z t ........'
   
root = Tkinter.Tk()
root.title("Stoppuhr")
   
# Fixing the window size.
root.minsize(width=350, height=70)
label = Tkinter.Label(root, text="Willkommen   bei  Python", fg="red", font="Verdana 30 bold")
label.pack()
f = Tkinter.Frame(root)
start = Tkinter.Button(f, text='Start', width=6, command=lambda:Start(label))
stop = Tkinter.Button(f, text='Stop',width=6,state='disabled', command=Stop)
reset = Tkinter.Button(f, text='Reset',width=6, state='disabled', command=lambda:Reset(label))
f.pack(anchor = 'center',pady=5)
start.pack(side="left")
stop.pack(side ="left")
reset.pack(side="left")
root.mainloop()




OSWALD
User
Beiträge: 547
Registriert: Freitag 18. März 2022, 17:32

5.8.23

Die beiden iuletzt vorgestellten Programme
laufen übrigens auch auf Python idle und
hoffentlich hier.
Ich wollte auch Plotter-Code einbinden, aber leider
läuft dieser nicht auf Spyder, denn Spyder ; scheint
mit TEXTUA L nicht kompatibel zu sein, oder ?
Gruß OSWALD
OSWALD
User
Beiträge: 547
Registriert: Freitag 18. März 2022, 17:32

11.08.2023
Endlich habe ich den richtigen Einstieg in "Textual" gefunden.
In die Eingabenaufforderungen eintragen:
textual --help
Python -m textual
username
password
Das Ergebnis ist ausgezeichnet .
Es lohnt sich mit textual zu arbeiten
Die größten Probleme sind jetzt nur noch
den richtigen Pfad zu finden
Gute Zeit OSWALD
OSWALD
User
Beiträge: 547
Registriert: Freitag 18. März 2022, 17:32

13.8.23
Ein konkretes Beispiel mit anschließendem Ergebnis(oben)

############################################
StylesheetError: unable to read CSS file
'C:\\PYTHON310\\TEXTUALOrdner\\PYTHON310\\stopwatch.css'
############################################

Die CSS-Datei kann also 'noch' nicht gelesen werden.
Jetzt gibt man auf -Suchen- stopwatch.css ein.
Nun erscheint auf der linken Seite/Desktop
eine der vielen' stopwatch.css' - Adressen und auf der rechten
Seite die lokale 'Speicheradresse für stopwatch.css '. usw.
Links kann man also eine entsprechende CSS-Datei herunter laden .Es gibt
kostenlose und kostenpflichtige CSS-Dateien.
Einfach probieren.
Zuletzt bleibt noch - für Profis - sich eigene CSS-Dateien zu gestalten.
Textual ist ein sehr weites Feld .Zusammen mit Rich "unschlagbar", wie Python insgesamt.
Gut n Zeit OSWALD

Code: Alles auswählen


###########################################



##################################
from time import monotonic
 
from textual.app import App, ComposeResult
from textual.containers import ScrollableContainer
from textual.reactive import reactive
from textual.widgets import Button, Footer, Header, Static


class TimeDisplay(Static):
    """A widget to display elapsed time."""

    start_time = reactive(monotonic)
    time = reactive(0.0)
    total = reactive(0.0)

    def on_mount(self) -> None:
        """Event handler called when widget is added to the app."""
        self.update_timer = self.set_interval(1 / 60, self.update_time, pause=True)

    def update_time(self) -> None:
        """Method to update time to current."""
        self.time = self.total + (monotonic() - self.start_time)

    def watch_time(self, time: float) -> None:
        """Called when the time attribute changes."""
        minutes, seconds = divmod(time, 60)
        hours, minutes = divmod(minutes, 60)
        self.update(f"{hours:02,.0f}:{minutes:02.0f}:{seconds:05.2f}")

    def start(self) -> None:
        """Method to start (or resume) time updating."""
        self.start_time = monotonic()
        self.update_timer.resume()

    def stop(self):
        """Method to stop the time display updating."""
        self.update_timer.pause()
        self.total += monotonic() - self.start_time
        self.time = self.total

    def reset(self):
        """Method to reset the time display to zero."""
        self.total = 0
        self.time = 0


class Stopwatch(Static):
    """A stopwatch widget."""

    def on_button_pressed(self, event: Button.Pressed) -> None:
        """Event handler called when a button is pressed."""
        button_id = event.button.id
        time_display = self.query_one(TimeDisplay)
        if button_id == "start":
            time_display.start()
            self.add_class("started")
        elif button_id == "stop":
            time_display.stop()
            self.remove_class("started")
        elif button_id == "reset":
            time_display.reset()

    def compose(self) -> ComposeResult:
        """Create child widgets of a stopwatch."""
        yield Button("Start", id="start", variant="success")
        yield Button("Stop", id="stop", variant="error")
        yield Button("Reset", id="reset")
        yield TimeDisplay()


class StopwatchApp(App):
    """A Textual app to manage stopwatches."""

    CSS_PATH = "PYTHON310\\stopwatch.css"

    BINDINGS = [
        ("d", "toggle_dark", "Toggle dark mode"),
        ("a", "add_stopwatch", "Add"),
        ("r", "remove_stopwatch", "Remove"),
    ]

    def compose(self) -> ComposeResult:
        """Called to add widgets to the app."""
        yield Header()
        yield Footer()
        yield ScrollableContainer(Stopwatch(), Stopwatch(), Stopwatch(), id="timers")

    def action_add_stopwatch(self) -> None:
        """An action to add a timer."""
        new_stopwatch = Stopwatch()
        self.query_one("#timers").mount(new_stopwatch)
        new_stopwatch.scroll_visible()

    def action_remove_stopwatch(self) -> None:
        """Called to remove a timer."""
        timers = self.query("Stopwatch")
        if timers:
            timers.last().remove()

    def action_toggle_dark(self) -> None:
        """An action to toggle dark mode."""
        self.dark = not self.dark


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




















OSWALD
User
Beiträge: 547
Registriert: Freitag 18. März 2022, 17:32

29.08,23
Ende der Sommerpause.
Ein Problem ist aufgetaucht.
RICH und Textual können auf der Eingabeaufforderung
nur noch Text und keine Graphik mehr darstellen. Ursache
bis jetzt unbekannt.
Anderes Thema; Physik-Programme bis zur Klärung
Gute Zeit OSWALD

Code: Alles auswählen


######Mechanik ; Schiefer Wurf
print("Schiefer Wurf mit Luftwiderstand")
print(" Luftwiderstand prop v^2")
print("Abschusswinkel  alpha ")
      


import math  
from math import sin,cos, pi
g = 9.81 # Erdbeschleunigung (m/s^2)
dt = 0.5 # Zeitschritt (s)
m = 8.8e-3 # Kugelmasse (kg)
rho = 1.06e-3 # Reibungskoeffizient
# Anfangsbedingungen:
t = 0
v0 = 20 # Anfangsgeschwindigkeit (m/s)
#alpha =  Abschusswinkel (Grad)
alpha = 45 / 180 * pi # Bogenmass
 
vx = v0 * cos(alpha)
vy = v0 * sin(alpha)
 
while t < 5:
     print ("%4.1f%8.2f%8.2f" %(t, vy, v0))
     v0 = v0 - g * dt
     vy = vy + v0 * dt
     t = t + dt
     print(" meter  ",vx)
     print(" mm/sec ",v0)  
     print(" sec   von  0 -> Ziel","bei  Meter ", t) 
     print("Abschusswinkel in Grad "", vy ")


OSWALD
User
Beiträge: 547
Registriert: Freitag 18. März 2022, 17:32

8.9.32
Die Ferien sind u Ende ,die Probleme
mit Powershell bleiben.

So werden werden Befehle
wie python -m rich.layout
oder python -m rich.table und viele andere korrekt dargestellt,
analoge Skriptbefehle wie richtable.py jedoch
schon seit einiger zeit nicht mehr.
Bisher konnte ich die Ursache dafür nicht klären.
Rich und Textual sind zwar immer noch interessant, aber
solange die Barriere 'Powershell' besteht, weitere Fortschritte
nicht möglich.
Andere Felder in Python mit seinen Bibliotheken rücken wieder
in den Fokus.
Gute Zeit OSWALD
OSWALD
User
Beiträge: 547
Registriert: Freitag 18. März 2022, 17:32

8.9.23
Nach Upgrade von Python3.11.4 auf 3.11.5 kann ich alle
Rich-Programme mit SPYDER 5 ser gut darstellen,

Bei Textual laufen , ebenfalls auf Spyder , alle Programme
fehlerfrei bis auf eine Fehlermeldung
* RuntimeError: This event loop is already running *
Ich vermute, dass die 2. Ebene nicht verlassen wird ? Üder ??
Jetzt uss ich noch einmal gründlich nachschauen, woran das liegen
könnte.
Gute Zeit OSWALD
Benutzeravatar
Dennis89
User
Beiträge: 1506
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

hast du mal die vollständige Fehlermeldung und den Code dazu?

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Antworten