Eine Stelle einer Zahl andersfarbig darstellen

Aus Micropython Referenz
Zur Navigation springen Zur Suche springen

Für die Eingabe von Werten mit dem Rotaryencoder des M5DinMeter benötige ich eine Routine, die ein ausgewähltes Digit andersfarbig darstellt. Damit kann dargestellt werden auf welche Stelle der Zahl sich die Eingabe bezieht.
Dazu habe ich Chatgbt.com um Hilfe gebeten. Dessen Lösung ist zwar nicht UIFlow2 kompatibel, obwohl das ausdrücklich gefordert war, bietet aber einen interessanten Ansatz:

from m5stack_ui import M5Screen
from m5stack import M5Led
from uiflow import wait

# Bildschirm initialisieren
screen = M5Screen()
screen.clean_screen()

# Wort und Farben definieren
text = "M5Stack"
colors = [(255, 0, 0), (0, 255, 0), (0, 0, 255), (255, 255, 0), (255, 0, 255), (0, 255, 255), (255, 255, 255)]

# Startposition und Zeichenabstand
x_start, y_start = 10, 50
spacing = 30

# Zeichen einzeln zeichnen
for i, char in enumerate(text):
    color = colors[i % len(colors)]  # Farbe für das Zeichen
    screen.set_screen_color((0, 0, 0))  # Hintergrundfarbe, falls gewünscht
    screen.draw_string(x_start + i * spacing, y_start, char, color=color)

Meine Lösung[Bearbeiten | Quelltext bearbeiten]

Nun habe ich mich mal darüber her gemacht und eine Funktion entwickelt die eine Stelle einer Zahl andersfarbig darstellt.
Dabei habe ich einige Grundannahmen gemacht, um mich auf's Wesentliche konzentrieren zu können.

Grundannahmen:[Bearbeiten | Quelltext bearbeiten]

Display.setRotation(1)                 # Display Ausrichtung horizontal Rotary-Knopf rechts

forground_color = 0xffff00             # Vordergrundfarbe
background_color = ~forground_color    # Hintergrund ist komplementär zum Vordergrund
  • forground_color und background_color wurden als globale Variablen definiert.
  • Zum Markieren wird Vordergrund- und Hintergrundfarbe komplementiert.
  • die X- und Y-Position der Ausgabe ist in der Funktion festgelegt.
  • der Font ist in der Funktion festgelegt.

So brauche ich mich nur die wirklich wichtigen Parameter number und digit zu kümmern, die an die Funktion übergeben werden.

Die Funktion mark_digit(number, digit)[Bearbeiten | Quelltext bearbeiten]

def mark_digit(number, digit):
    global forground_color, background_color
    x_start = 20
    y_start = 25
    num_string = f'{number:1.4f}'
    digit -= 1
    # Dezimalpunkt Index ermitteln
    dp_index = num_string.index('.')
    # print(dp_index)    # OK
    # Stellenindex nach dem Dezimalpunkt anpassen
    if digit >= dp_index:
        digit += 1
    Display.setFont(M5.Lcd.FONTS.DejaVu40)
    step = 25
    Display.clear(~0xffff00)
    for i in range(len(num_string)):
        if i < digit:            
            Display.setTextColor(fgcolor=forground_color, bgcolor=background_color)
            Display.setCursor(x_start+i*step, y_start)
            Display.print(num_string[i])
        elif i == digit:            
            Display.setTextColor(fgcolor=~forground_color, bgcolor=~background_color)
            Display.setCursor(x_start+i*step, y_start)
            Display.printf(num_string[i])
        else:
            Display.setTextColor(fgcolor=forground_color, bgcolor=background_color)
            Display.setCursor(x_start+i*step, y_start)
            Display.printf(num_string[i])