Seite 1 von 1
QlineEdit -> Datenerfassung - eins steuert die anderen - howto?
Verfasst: Sonntag 13. Dezember 2015, 13:20
von pk_jahn
Hallo,
vielleicht sehe ich den Wald vor Bäumen nicht.
Ich habe ein Window mit 6 QlineEdits - 1 QlineEdit wird als MainEingabe verwendet - wenn ein " " eingegeben wird wird der String analysiert (besser das letzte "Wort" analysiert und basierend auf Regeln abgebildet. Dieses soll dann in eines der anderen LineEdits geschrieben werden - und wenn alle 5 LineEdits "versorgt" sind diese Daten gespeichert.
D.h. eine Eingabe von a b c d e soll dann jeweils in einem LineEdit stehen (notfalls kann man bei Falschgetippe da noch editieren).
Der nächste Datensatz hat z.B. nur 2 von den ersten geänderte Werte - somit braucht nur z.B. b und c getippt werden, der Rest bleibt gleich.
(ich schliesse die Eingabe mit einem " q " ab -> dann braucht man nicht Enter oder Maus nutzen ...)
Jetzt kommt der "Wald" - ich bin inzwischen der Meinung, das ich ein EMIT brauche, wenn ein Wort erkannt wurde und das dann dem jeweiligen LineEdit zuordnen muss. Aber da bin ich raus aus dem Spiel - die Beispiele, die "ähnlich" irgendwo zu finden sind, sind eher für Labels oder .. geschrieben und behandeln mehr eine 1:1 Beziehung.
Scheinbar ist eine Lösung für dieses eher bei TkInter zu machen - jedenfalls sieht es hier einfacher aus - aber für mich hat PyQT4 den Vorteil, das es moderner aussieht und weiterentwickelt wird.
Unter Lazarus hab ich das innerhalb kurzer Zeit (1 Stunde) lösen können, aber für mich ist Python generell effizienter/besser inzwischen.
Gruss und schöne Vorweihnachtszeit Peter
Re: QlineEdit -> Datenerfassung - eins steuert die anderen - howto?
Verfasst: Sonntag 13. Dezember 2015, 16:09
von jerch
@pk_jahn:
Ich würde an Deiner Stelle nochmal die Usability Deines Ansatzes überdenken. Ich find die Sache mit dem "Main"-Input und den Sub-LineEdits eher verwirrend vorallem in der Bedienung. Zusätzlich handelst Du Dir Update-/Darstellungsprobleme ein - was z.B. soll mit dem Text des Hauptinputs passieren, wenn jmd. in einem Sub-LineEdit etwas editiert? Oder wenn mehr Tokens geschrieben werden als LineEdits vorhanden sind? Was passiert, wenn man in den Subinputs ein Leerzeichen einfügt? Das sind Probleme, welche Du mit getrennten Inputs nicht hättest. Auch ist die Eingabe eines <Enter> oder <Tab> nicht aufwändiger als die <Leertaste>.
Mit Deinem Ansatz ginge es etwa dergestalt (mit etlichen Zusatzannahmen):
Code: Alles auswählen
from PyQt4 import QtGui
from PyQt4 import QtCore
from functools import partial
class Tokenizer(QtCore.QObject):
tokenChanged = QtCore.pyqtSignal([list])
textChanged = QtCore.pyqtSignal([unicode])
def __init__(self, token_count, parent=None):
QtCore.QObject.__init__(self, parent)
self.token_count = token_count
self.tokens = [u''] * self.token_count
@property
def text(self):
return u' '.join(filter(bool, self.tokens))
@text.setter
def text(self, value):
value = unicode(value)
tokens = filter(bool, value.split(u' '))
self.tokens = []
for i in range(self.token_count):
self.tokens.append(tokens[i] if i<len(tokens) else u'')
self.tokenChanged.emit(self.tokens)
def setToken(self, i, s):
self.tokens[i] = unicode(s).replace(u' ', u'')
self.tokenChanged.emit(self.tokens)
self.textChanged.emit(self.text)
return self.tokens[i]
class MyWidget(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.layout = QtGui.QVBoxLayout(self)
self.inpMain = QtGui.QLineEdit()
self.layout.addWidget(self.inpMain)
self.token_count = 4
self.subInputs = [QtGui.QLineEdit() for i in range(self.token_count)]
for i, sub in enumerate(self.subInputs):
self.layout.addWidget(sub)
sub.textEdited.connect(partial(self.changeToken, i))
self.tokenizer = Tokenizer(self.token_count, self)
self.inpMain.textEdited.connect(self.evalText)
self.tokenizer.tokenChanged.connect(self.setInputsText)
self.tokenizer.textChanged.connect(self.inpMain.setText)
def evalText(self, s):
self.tokenizer.text = s
def setInputsText(self, tokens):
map(lambda w, t: w.setText(t), self.subInputs, tokens)
def changeToken(self, i):
self.subInputs[i].setText(self.tokenizer.setToken(i, self.subInputs[i].text()))
if __name__ == '__main__':
app = QtGui.QApplication([])
win = MyWidget()
win.show()
app.exec_()
Re: QlineEdit -> Datenerfassung - eins steuert die anderen - howto?
Verfasst: Sonntag 13. Dezember 2015, 20:11
von pk_jahn
Oh - das sieht vielversprechend aus - interessant!
Nein, der Ansatz ist richtig - d.h. die Eingabezeile ist nicht abzudaten, wenn die Daten erfasst wurde, d.h. ich gehe nicht davon aus, irgendwas im EingabeLineEdit zu editieren (wenn das Wort "beendet" eingegeben wurde). Die Korrektur muss dann über die anderen LineEdit erfolgen (ausser meine Bedingung " q " für Dateneingabe fertig wurde geschrieben. Enter will ich nicht nehmen, weil das zu "einfach" ist wenn man die Daten nicht fertig hatte.
Der Code sieht sehr vielversprechend aus und zeigt mir einige Ansätze, die ich bisher nicht bei meinen "Recherchen" so gesehen habe.
Die Frage, das mehr Daten eingegeben wurden, als notwendig ist einfach: Es gibt nicht mehr und wenn die "Mehreingabe" stimmt, wird ein bestehendes Data überschrieben, d.h. ich brauch damit nicht im entsprechenden Lineedit zu editieren. Es gibt bei meinem Ansatz nur genau 5 oder 6 Datenarten wie Zeit, Datum, ... Minimal sind 2 Data einzutippen, maximal alle 5 oder 6. Die Daten können in beliebiger Reihenfolge getippt werden, durch die Auswertung in einer DEF werden die dann "eindeutig" zugeordnet - falls das mal nicht sein sollte - gibt es eine "Warnung".
Leertzeichen in den Subedits sind nicht vorgesehen - grundsätzlich nicht - daher der Ansatz mit " " als Trenner - ist auch einfacher zu "tippen".
Vielen Dank - ich muss jetzt mich damit tiefer beschäftigen - der Code zeigt mir einige "Tricks", die so mir bisher nirgends untergekommen sind - aber Python kann schon komplex werden.
Gruss Peter
Re: QlineEdit -> Datenerfassung - eins steuert die anderen - howto?
Verfasst: Sonntag 13. Dezember 2015, 22:25
von jerch
@pk_jahn:
Kannst Du mal kurz umreissen, was das am Ende können soll? Für mich klingt es nach einem simplen Formular mit optionalen Eingaben. Die Sache mit dem übergeordneten Eingabefeld, welches mit "q" beendet werden muss dagegen wie seltsame Magie - unerwartet aus Benutzersicht und unnötig verkompliziert.
Re: QlineEdit -> Datenerfassung - eins steuert die anderen - howto?
Verfasst: Sonntag 13. Dezember 2015, 22:57
von bb1898
jerch hat geschrieben:@pk_jahn:
Kannst Du mal kurz umreissen, was das am Ende können soll? Für mich klingt es nach einem simplen Formular mit optionalen Eingaben. Die Sache mit dem übergeordneten Eingabefeld, welches mit "q" beendet werden muss dagegen wie seltsame Magie - unerwartet aus Benutzersicht und unnötig verkompliziert.
Für mich klingt es
a) nach einer Datenerfassungs-Aufgabe, bei der sich oft Teile der Eingaben wiederholen,
b) nach Datenerfassung durch Leute, die wirklich tippen können und wollen, alle Finger ständig auf der Tastatur liegen haben und nicht so gern an die äußersten Ecken derselben springen, das kostet Zeit.
Ob die Idee mit der einen Eingabezeile und der nachträglichen Verteilung auf die Felder wirklich gut ist, da bin ich auch nicht ganz sicher, wäre auszuprobieren. Welchen Benutzern man das dann beibringen kann, ist auch noch eine Frage; oder geht's um Eigenbedarf?
Re: QlineEdit -> Datenerfassung - eins steuert die anderen - howto?
Verfasst: Montag 14. Dezember 2015, 00:18
von pk_jahn
bb1898 hat geschrieben:jerch hat geschrieben:@pk_jahn:
Kannst Du mal kurz umreissen, was das am Ende können soll? Für mich klingt es nach einem simplen Formular mit optionalen Eingaben. Die Sache mit dem übergeordneten Eingabefeld, welches mit "q" beendet werden muss dagegen wie seltsame Magie - unerwartet aus Benutzersicht und unnötig verkompliziert.
Für mich klingt es
a) nach einer Datenerfassungs-Aufgabe, bei der sich oft Teile der Eingaben wiederholen,
b) nach Datenerfassung durch Leute, die wirklich tippen können und wollen, alle Finger ständig auf der Tastatur liegen haben und nicht so gern an die äußersten Ecken derselben springen, das kostet Zeit.
Ob die Idee mit der einen Eingabezeile und der nachträglichen Verteilung auf die Felder wirklich gut ist, da bin ich auch nicht ganz sicher, wäre auszuprobieren. Welchen Benutzern man das dann beibringen kann, ist auch noch eine Frage; oder geht's um Eigenbedarf?
Ja - es ist ein simples Formular im Grunde.
Das übergeordnete Eingabefeld dient, wie bb1898 in a. und b. schreibt, nur in diesem Feld die Daten zu schreiben. Die Verteilung auf die Felder ist ok, weil die Inhalte definiert vorliegen - aber durch die Eingabezeile man nicht daran gehalten ist, in welcher Reihenfolge man die eintippt. Ob es sich um ein Datum, Uhrzeit oder xyz handelt kann man über RE abfragen. Da z.B. das Datum oftmals gleich ist, muss das nicht mehr eingegeben werden und wird vom vorherigen Datensatz übernommen.
Ob ich die Eingabe mit "q" abschliesse oder mit Return ist wirklich relativ aber für mich ist ein Return zu schnell gedrückt, falls die Daten doch nicht richtig waren - aber die werden danach sofort abgespeichert.
Programme, mit denen man das derzeit machen kann, haben immer den Nachteil, das man z.B. das Datum mittels Kalender auswählen muss - ätzend, wenn man dasDatum oft ändern muss oder? Da tippt man doch schneller
In erster Linie ist es erstmal für mich - wenn es funktioniert gehts an die Mitglieder in meinem Klub die ebenfalls daran interessiert sind - die Daten sind Verbindungsdaten, die auf Karten vorliegen - und dann digital mittels dieser "simplen" Datenerfassung erfasst werden können - möglichst effektiv und somit schnell ohne "Schnickschnack".
Danke nochmal Jerch, der Code zeigt mir den Weg bzw. es geht weiter - python ist sehr effektiv - aber in Kombi mit PyQT ist es oft recht "komplex" - jedenfalls für mich älteren Knochen der früher mal fortran77 und Pascal programmierte (in Sachen GUI ist jedenfalls Lazarus schon einfacher gestrickt

)
Peter
Re: QlineEdit -> Datenerfassung - eins steuert die anderen - howto?
Verfasst: Montag 14. Dezember 2015, 22:06
von bb1898
pk_jahn hat geschrieben:
Ja - es ist ein simples Formular im Grunde.
Das übergeordnete Eingabefeld dient, wie bb1898 in a. und b. schreibt, nur in diesem Feld die Daten zu schreiben. Die Verteilung auf die Felder ist ok, weil die Inhalte definiert vorliegen - aber durch die Eingabezeile man nicht daran gehalten ist, in welcher Reihenfolge man die eintippt. Ob es sich um ein Datum, Uhrzeit oder xyz handelt kann man über RE abfragen. Da z.B. das Datum oftmals gleich ist, muss das nicht mehr eingegeben werden und wird vom vorherigen Datensatz übernommen.
Ob ich die Eingabe mit "q" abschliesse oder mit Return ist wirklich relativ aber für mich ist ein Return zu schnell gedrückt, falls die Daten doch nicht richtig waren - aber die werden danach sofort abgespeichert.
So könnte man wahrscheinlich auch ein halbwegs komfortables Kommandozeilen-Programm machen: die eine Eingabezeile entgegennehmen, auseinandernehmen, und statt weiterer Eingabefelder, in die man nicht schreiben darf/soll, das Ergebnis passend formatiert auf der Konsole ausgeben. Viel einfacher zu programmieren als diese elendigen GUIs. Und eine Eingabezeile, auch eine längere, richtig einzugeben, ist bequemer als das Antworten auf mehrere Fragen. Allein schon, weil man bis zum Abschicken die komplette Zeile korrigieren kann.
Programme, mit denen man das derzeit machen kann, haben immer den Nachteil, das man z.B. das Datum mittels Kalender auswählen muss - ätzend, wenn man dasDatum oft ändern muss oder? Da tippt man doch schneller
Wie wahr.