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)
Schöne Grüße