Programmaufbau mit Curses

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
Benutzeravatar
__LC__
User
Beiträge: 32
Registriert: Dienstag 1. März 2011, 14:08
Wohnort: 127.0.0.1
Kontaktdaten:

Liebe Python-Freunde!

Ich möchte gern mittels der Curses-Bibliothek eine kleine Konsolenanwendung schreiben, die vom Funktionsumfang eigentlich recht einfach gehalten ist. Und zwar geht es konkret darum eine Oberfläche zu gestalten, die es auf der einen Seite gestattet einen Parameterwert zu setzen (beispielsweise eine Spannung eines Gerätes) und auf der anderen Seite unabhängig von jeweiliger Benutzerinteraktion einen Rückgabewert eines zweiten Gerätes (beispielsweise eine Temperatur) periodisch darstellt. Aufgrund fehlender Erfahrung, bisher habe ich Python mehr zum Skripten als zur Applikationserstellung genutzt, stehe ich vor dem konkreten Problem, wie ich die Benutzeroberfläche hierarchisch aufsetzten sollte. Bisher sieht es so bei mir aus:

Code: Alles auswählen

import curses
import threading
import queue
import random

class Indicator:
    def __init__(self, reader, pos_x=0, pos_y=0, size_x=20, size_y=20):
        self.reader = reader
        self.window = curses.newwin(size_y, size_x, pos_y, pos_x)
        self.thread = threading.Thread(target=self.__run, daemon=True)
        self.trigger = queue.Queue()
        self.pdc_interval = -1
        self.running = False
        self.thread.start()
    
    def _get_periodic_interval(self):
        return self.pdc_interval
    
    def _set_periodic_interval(self, value):
        if value < -1:
            raise ValueError('Invalid number for the pdc interval')
        if value != self.pdc_interval:
            self.pdc_interval = value
            self.trigger.put(True)
    
    periodic_interval = property(_get_periodic_interval, _set_periodic_interval)
    
    def __run(self):
        self.running = True
        i = 0
        while True:
            try:
                _timeout = None if self.pdc_interval == -1 else (self.pdc_interval)
                self.trigger.get(True, _timeout)
            except queue.Empty:
                self.window.clear()
                value = self.reader()
                self.window.addstr(2, 2, 'Value: {0}'.format(value))
                self.window.refresh()
            print()
            i += 1


class Control:
    def __init__(self, pos_x=0, pos_y=0, size_x=20, size_y=20):
        self.window = curses.newwin(size_y, size_x, pos_y, pos_x)
    
    def input(self):
        self.window.clear()
        self.window.addstr(1, 1, 'New value: ')
        return self.window.getkey()
    

class MyApp:
    def __init__(self, stdscr):
        self.stdscr = stdscr
        self.stdscr.clear()
        self.indicator = Indicator(lambda: random.randrange(1.0, 10.0), 30, 5)
        self.indicator.periodic_interval = 0.5
        self.control = Control(0, 0, 20, 20)
        self.run()
    
    def run(self):
        while True:
            value = self.control.input()

if __name__ == '__main__':
    curses.wrapper(MyApp)
Ist alles noch ganz rundimentär, allerdings weiß ich auch nicht wie ich konkret weiter machen sollte. Würde mich deshalb gern über ein paar Anregungen freuen.

Schöne Grüße
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@__LC__:
Schau Dir mal urwid an, das ist eine Art TUI-Bibliothek, welche deutliich komfortabler zu nutzen ist als curses direkt. Da gibts auch etliche Beispiele, wie man eine Anwendung sinnvoll strukturiert.
Antworten