Siebensegment; TypeError: 'str' object is not callable

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Kiwi_gamer01
User
Beiträge: 17
Registriert: Freitag 2. November 2018, 21:55

Hallo, irgendetwas funktionier mit der Devinition date oder 'date(seg)' nicht

dies ist ein Shell scriptt dür eine Sieben Segmentanzeige


Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Copyright (c) 2017-18 Richard Hull and contributors
# See LICENSE.rst for details.
import time
from datetime import datetime


from luma.led_matrix.device import max7219
from luma.core.interface.serial import spi, noop
from luma.core.virtual import viewport, sevensegment


def date(seg):
    now = datetime.now()
    seg.text = now.strftime("%y-%m-%d")


def clock(seg, seconds):
    interval = 0.5
    for i in range(int(seconds / interval)):
        now = datetime.now()
        seg.text = now.strftime("%H-%M-%S")

        if i % 2 == 0:
            seg.text = now.strftime("%H-%M-%S")
        else:
            seg.text = now.strftime("%H %M %S")

        time.sleep(interval)


def show_message_vp(device, msg, delay=0.1):
    # Implemented with virtual viewport
    width = device.width
    padding = " " * width
    msg = padding + msg + padding
    n = len(msg)

    virtual = viewport(device, width=n, height=8)
    sevensegment(virtual).text = msg
    for i in reversed(list(range(n - width))):
        virtual.set_position((i, 0))
        time.sleep(delay)


def show_message_alt(seg, msg, delay=0.1):
    width = seg.device.width
    padding = " " * width
    msg = padding + msg + padding

    for i in range(len(msg)):
        seg.text = msg[i:i + width]
        time.sleep(delay)

def main():
    serial = spi(port=0, device=0, gpio=noop())
    device = max7219(serial, cascaded=1)
    seg = sevensegment(device)
   
    time = 'time'
    date = 'date'
    scroll = 'scroll'
    exit = 'exit'
    display = 'display'
    Display = 'Display'   

    while True:
        print ("")
        print("time      =          Uhrzeit")
        print("date      =            Datum")
        print("scroll    =   Scrolling-Text")
        print("display   =  Displaying-TExt")
        print("exit      =             Exit")
        print("")
        Input = raw_input("What will you do? ")

        if Input == time:
            print ("")
            print ("Uhrzeit für 60 Sekunden aktiviert")
            clock(seg, seconds=60)
            seg.text = ""

        elif Input == date:
            print ("")
            print ("Datum für 60 Sekunden aktiviert")
            date(seg)
            time.sleep(60)
            seg.text = ""

        elif Input == scroll:
            print("")
            Scroll = raw_input("What should scroll? ")
            print ("Scrolling "+Scroll+" ")
            show_message_alt(seg,""+Scroll+"")
#            print ("Scrolling "+Scroll+" ")

        elif Input == display:
            print ("")
            print ("Maximal 8 Buchstaben / Zeichen")
            Display = raw_input("What should display? ")
            print ("Displaying "+Display+" for 10 Sekonds ")
            seg.text = (" "+Display+" ")
            time.sleep(10) 
            seg.text = ""

        elif Input == exit:
            seg.text = (" ")
            break 

        else:
            print ("Unkown command / For Exit 'exit' or 'Ctrl + C'")

if __name__ == '__main__':
    main()



Wenn ich das Script starte und
'date' eingebe komm ich in die 'If schleife date'
anstatt das 'date(seg)' startet bekomme ich diese Fehlermeldung

Code: Alles auswählen

What will you do? date

Datum für 60 Sekunden aktiviert
Traceback (most recent call last):
  File "All.py", line 116, in <module>
    main()
  File "All.py", line 88, in main
    date(seg)
TypeError: 'str' object is not callable
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Der Code in main() sieht gruselig aus.

Die Fehlermeldung sagt dir übrigens genau woran es liegt: date ist ein Objekt vom Typ str, aber du versuchst es wie eine Funktion aufzurufen. Klar, auf globaler Ebene hast du eine Funktion die date heißt, aber in main verwendest du date für etwas anderes (date = 'date').
PyFM

Du überschreibst die Funktion date() mit einem gleichnamigen String, welchen man logischer Weise nicht wie eine Funktion aufrufen kann. Ich würde ähnliche und gleiche Variablen-Namen immer vermeiden. Das führt sonst nur zu Verwirung.
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Kiwi_gamer01: Das gleiche Problem hast Du auch noch mindestens mit `time`. Da wird Dir dann um die Ohren fliegen das Zeichenketten kein `sleep`-Attribut besitzen.

Man sollte keine Programme mehr in Python 2 anfangen.

Die Zeichenketten die Du da vor der Schleife definierst machen so auch gar keinen Sinn. Warum machst Du das? `Display` sollte klein geschrieben werden, weil man alle Namen in Python klein_mit_unterstrichen schreibt – ausgenommen Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase). Dann würde das aber mit dem bereits vorhandenen `display` kollidieren. Der Wert der `Display` dort zugewiesen wird, wird aber auch nirgends verwendet.

Was `display` heissen sollte ist `seg`, denn genau dafür steht dieses Objekt und dann muss man nicht raten was `seg` wohl bedeuten soll. Keine nicht allgemein geläufigen Abkürzungen!

Zeichenkettenliterale und Werte mit ``+`` zusammenstückeln ist eher BASIC als Python. In Python gibt es dafür Zeichenkettenformatierung mit der `format()`-Methode auf Zeichenketten. Und was soll das bringen links und rechts an eine Zeichenkette eine literale leere Zeichenkette zu ”addieren”? Das macht Null Sinn.

Um einige Zeichenketten sind unnötige Klammern.

Deine Ausgabetexte sind mal Deutsch und mal Englisch.

`date` und `clock` sind keine guten Namen für Funktionen, weil sie keine Tätigkeit beschreiben.

In `clock()` kann man sich die erste Zuweisung an `seg.text` sparen, weil die ja gleich darauf sowieso wieder überschrieben wird.

Komponenten einer Zeitangabe durch '-' zu trennen statt durch ':' ist ungewöhnlich.

`show_message_vp()` wird nicht verwendet.

Überarbeitet könnte das so aussehen (ungetestet):

Code: Alles auswählen

#!/usr/bin/env python3
# Copyright (c) 2017-18 Richard Hull and contributors
# See LICENSE.rst for details.
import time
from datetime import datetime
from itertools import cycle, islice

from luma.core.interface.serial import spi, noop
from luma.core.virtual import sevensegment
from luma.led_matrix.device import max7219


def show_clock(display, seconds):
    interval = 0.5
    for delimiter in islice(cycle([':', ' ']), int(seconds / interval)):
        display.text = '{0:%H{1}%M{1}%S}'.format(datetime.now(), delimiter)
        time.sleep(interval)


def show_date(display):
    display.text = datetime.now().strftime('%y-%m-%d')


def show_message_alt(display, message, delay=0.1):
    width = display.device.width
    message = '{0}{1}{0}'.format(' ' * width, message)
    for i in range(len(message)):
        display.text = message[i:i + width]
        time.sleep(delay)


def main():
    display = sevensegment(
        max7219(spi(port=0, device=0, gpio=noop()), cascaded=1)
    )
    while True:
        print()
        print('time      =          Uhrzeit')
        print('date      =            Datum')
        print('scroll    =   Scrolling-Text')
        print('display   =  Displaying-Text')
        print('exit      =             Exit')
        print()
        choice = input('What do you want to do? ')
        print()
        if choice == 'time':
            print('Uhrzeit für 60 Sekunden aktiviert')
            show_clock(display, seconds=60)
            display.text = ''

        elif choice == 'date':
            print('Datum für 60 Sekunden aktiviert')
            show_date(display)
            time.sleep(60)
            display.text = ''

        elif choice == 'scroll':
            text = input('What should scroll? ')
            print('Scrolling', text)
            show_message_alt(display, text)

        elif choice == 'display':
            print('Maximal 8 Buchstaben / Zeichen')
            text = input('What should display? ')
            print('Displaying', text, 'for 10 seconds')
            display.text = ' {} '.format(text)
            time.sleep(10) 
            display.text = ''

        elif choice == 'exit':
            display.text = ''
            break 

        else:
            print("Unkown command / For Exit 'exit' or 'Ctrl + C'")


if __name__ == '__main__':
    main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten