@MaxPotter: Wie gesagt: Auf Teilprobleme runterbrechen. Das einlesen der Zeilen ist ganz einfach weil Dateiobjekte iterierbar sind und dabei die einzelnen Zeilen liefern.
Code: Alles auswählen
#!/usr/bin/env python3
def main():
with open("test.txt", encoding="ascii") as lines:
for line in lines:
print(line)
if __name__ == "__main__":
main()
Im nächsten Schritt überlegt man sich dann welche Informationen in den Zeilen stecken und wie man eine Zeile in eine möglichst gleichförmige Datenstruktur überführen kann die diese Informationen enthält. Das wäre beispielsweise ein Tupel aus dem Kommando und einer Liste mit den Zahlen. Wobei nicht jedes Kommando Zahlen hat — dann bleibt die Liste leer. Sie sollte aber trotzdem da sein, das vereinfacht das weiterverarbeiten. Dazu schreibt man sich dann eine Funktion die aus einer gegeben Zeile so ein Tupel erstellt.
Code: Alles auswählen
#!/usr/bin/env python3
COMMAND_NAME_TO_ARGUMENT_COUNT = {"PA": 2, "PD": 0, "PU": 0}
def parse_line(line):
"""
Parse given input line into a tupel of command name and arguments.
Raises:
ValueError: if the line doesn't end with ";", or the argument(s) can't
be parsed as numbers, or has the wrong number of arguments.
KeyError: if the command name is unknown.
Examples:
>>> parse_line("PU;")
('PU', [])
>>> parse_line("PA 23, 42;")
('PA', [23, 42])
"""
#
# TODO Hier kommt der Code hin der das macht was der Docstring beschreibt.
#
return (name, arguments)
def main():
with open("test.txt", encoding="ascii") as lines:
for name, arguments in map(parse_line, lines):
print(f"Kommando: {name!r}, Argumente: {arguments!r}")
if __name__ == "__main__":
main()
Die Ausgabe für Deine Beispieleingabe sieht dann so aus:
Code: Alles auswählen
Kommando: 'PU', Argumente: []
Kommando: 'PA', Argumente: [205, 2270]
Kommando: 'PD', Argumente: []
Kommando: 'PA', Argumente: [233, 2270]
Kommando: 'PU', Argumente: []
Kommando: 'PA', Argumente: [205, 2320]
Kommando: 'PD', Argumente: []
Kommando: 'PA', Argumente: [205, 2270]
Kommando: 'PU', Argumente: []
Kommando: 'PA', Argumente: [205, 2470]
Kommando: 'PD', Argumente: []
Kommando: 'PA', Argumente: [205, 2420]
Kommando: 'PU', Argumente: []
Kommando: 'PA', Argumente: [219, 2270]
Kommando: 'PD', Argumente: []
Kommando: 'PA', Argumente: [219, 2470]
Kommando: 'PU', Argumente: []
Kommando: 'PA', Argumente: [233, 2270]
Kommando: 'PD', Argumente: []
Kommando: 'PA', Argumente: [233, 2320]
Als nächstes muss man sich überlegen wie man mit dem Strom von (name, argumente)-Tupeln dem Ziel mit den Linien näher kommt. Eine Linie wird durch ihre beiden Endpunkte beschrieben. Liesse sich als Tupel mit Koordinatentupeln beschreiben: ((x₁, y₁), (x₂, y₂)). Also könnte man eine Funktion gebrauchen die aus einer Folge von Kommandotupeln, eine Folge von Linienkoordinatentupel erstellt.
Code: Alles auswählen
#!/usr/bin/env python3
COMMAND_NAME_TO_ARGUMENT_COUNT = {"PA": 2, "PD": 0, "PU": 0}
def parse_line(line):
"""
Parse given input line into a tupel of command name and arguments.
Raises:
ValueError: if the line doesn't end with ";", or the argument(s) can't
be parsed as numbers, or has the wrong number of arguments.
KeyError: if the command name is unknown.
Examples:
>>> parse_line("PU;")
('PU', [])
>>> parse_line("PA 23, 42;")
('PA', [23, 42])
"""
#
# TODO Hier kommt der Code hin der das macht was der Docstring beschreibt.
#
return (name, arguments)
def process_commands(commands):
"""
Turn iterable of commands into an iterable of line data in the form of
tuples with start and end points: ((x₁, y₁), (x₂, y₂)).
Examples:
>>> list(process_commands([("PD", []), ("PA", [10, 20])]))
[((0, 0), (10, 20))]
>>> commands = [("PU", []), ("PA", [10, 20]), ("PD", []), ("PA", [30, 40])]
>>> list(process_commands(commands))
[((10, 20), (30, 40))]
"""
#
# TODO Hier kommt der Code hin der das macht was der Docstring beschreibt.
#
def main():
with open("test.txt", encoding="ascii") as lines:
for line in process_commands(map(parse_line, lines)):
print(f"Linie: {line!r}")
if __name__ == "__main__":
main()
Die Ausgabe von dem Programm sieht dann so aus:
Code: Alles auswählen
Linie: ((205, 2270), (233, 2270))
Linie: ((205, 2320), (205, 2270))
Linie: ((205, 2470), (205, 2420))
Linie: ((219, 2270), (219, 2470))
Linie: ((233, 2270), (233, 2320))
Und dann wäre man auch schon dabei GUI-Code zu schreiben der dann Linien auf einem `tkinter.Canvas` zeichnet.