Hoch-Runter Button für mehrere Ornder

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
PappaBär83
User
Beiträge: 21
Registriert: Freitag 5. September 2014, 09:16

Halli Hallo
Kurz zu meinem Plan:
Das soll eine Oberfläche für ein 7"Touchdisplay werden.
Folglich: die Bedienung erfolgt nur über Buttons (keine Tasten).
Die Ordner-Struktur ist so aufgebaut, das im ersten Ordner mehrere Unterordner enthalten sind die wiederum Dateien enthalten. Allen Ordnern und Dateien sind Bilder Zugeordnet über die Navigiert wird.

Wird der Hörspielbutton (Ganz oben Links) gedrückt, erstellt sich eine Liste mit dem Inhalt aus (z.B.) Ordner1. Da für jeden Ordner ein Bild (.GIF) hinterlegt ist, wird also eine Liste von GIF-Bildern erstellt, und kann ,mit den Hoch-Runter-Buttons "Durchgeschaltet" werden. Erscheint das Gewünschte Bild, kann dieses gedrückt (/ausgewählt) werden. so gelangt man in den den Ordner2.
Das gleiche geschieht mit Ordner2 zu Ordner3.
In Ordner 3 sind Dateien die wiederum ausgewählt werden können.

Nun zu meinem Problem:
Ich steh gerade total auf dem Schlauch wie ich das angehen soll. Da das mein erstes Script wird fehlt mir alle Erfahrung in jeglicher Hinsicht. Beim ersten (Ordner-) Button bekomme ich das auch schon ganz gut hin. Mit den Hoch-Runter-Buttons schalten ich den Index der Liste (aus dem Ordnerinhalt) durch.
Nur wie sage ich den Hoch-Runter Buttons, durch welchen Ordner (-Index) sie sich schalten sollen?
Ich habe mir überlegt eine Variable (z.B.) "Ebene" anzulegen die ihren Wert (1 / 2 / 3 ) verändert, je nachdem durch welchen Ordner durchgeschaltet werden soll.

Das Problem vom Problem:
Wie erstelle ich eine Variable die von 3 Funktionen aus ihren Wert geändert bekommen kann?
(Ordner 1 Sagt: Ebene = 1) (Hoch-Runter-Buttons erkennen: jetzt im Index von Ordner 1 Schalten)
(Ordner 2 Sagt: Ebene = 2) (Hoch-Runter-Buttons erkennen: jetzt im Index von Ordner 2 Schalten)
(Ordner 3 Sagt: Ebene = 3) (Hoch-Runter-Buttons erkennen: jetzt im Index von Ordner 3 Schalten)

Bild

:K

Danke für Geduld und Mühe mein Problem zu verstehen ich hoffe ich hab das verständlich erklärt.
Bestimmt ich die Lösung auch ganz einfach aber ich steh echt auf dem Schlauch.

Danke
Benutzeravatar
pixewakb
User
Beiträge: 1412
Registriert: Sonntag 24. April 2011, 19:43

Wenn Du auf den Ordner 1 klickst, dann gibt es dazu eine Funktion, d. h. bei pyQt war das m. E. ein Signal, d. h. dort änderst du die Variable dann. Wenn du dann auf den Hoch- bzw. Runter-Button klickst, dann fragt die zugehörige Funktion den Wert der Variable ab und reagiert entsprechend, z. B. in dem sie eine Ordnerliste lädt oder was anderes macht.

Mit welchem Toolkit arbeitest du? Könnte Kivy sein? Schau mal hier:

http://zetcode.com/gui/pyqt4/eventsandsignals/

Da findest du ein Beispiel, wie man z. B. auf das Drücken eines Buttons in Qt reagiert.

Code: Alles auswählen

    def keyPressEvent(self, e):
[...]
Nur so am Rande: Falsches Unterforum (Verschieben denkbar). Du solltest angeben, welches Toolkit du nutzt. Du solltest deinen Quellcode (für den entsprechenden Bereich), falls möglich posten. BTW: Ich habe schon länger nicht mehr intensiv mit einem GUI-Toolkit gearbeitet, wunderte mich nicht, wenn ich etwas schief liege, konzeptionell sollte es aber stimmen.
PappaBär83
User
Beiträge: 21
Registriert: Freitag 5. September 2014, 09:16

Ich Habe die Frage hier gestellt weil es weniger um die Oberfläche (GUI) geht, sondern um die Grundsatzfrage sie ich EINE Variable von VERSCHIEDENEN Funkionen herraus beeinflussen kann. :K

Drücke Button 1 -> Variable "X" = ("AAA")
Drücke Button 2 -> Variable "X" = ("BAA")
.
.
.
Drücke Button 31056 -> Variable "X" = ("CJP")

Der Hoch- / Runter- Button erkennt an Variable "X" ("DAA") das er sich durch den ListenIndex 4 durcharbeiten muss.

Wenn du der Meinung bist das ich mit der Frage in einem anderen Forums-Teil besser aufgehoben bin werde ich dahin wechseln.

Dank dir schonma.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@PappaBär83:
Ohne Angabe des GUI-Toolkits kann man das nicht beantworten. Die verschiedenen Toolkits halten unterschiedliche Event- und Singalmechanismen für sowas vor.

Wenn es Dir wirklich nur um die Frage geht:
Ich Habe die Frage hier gestellt weil es weniger um die Oberfläche (GUI) geht, sondern um die Grundsatzfrage sie ich EINE Variable von VERSCHIEDENEN Funkionen herraus beeinflussen kann.
:

Code: Alles auswählen

def a():
    # some code
    return 'AAA'

def b():
    # some code
    return 'BAA'

x = a() # x ist 'AAA'
x = b() # x ist 'BAA'
Benutzeravatar
pixewakb
User
Beiträge: 1412
Registriert: Sonntag 24. April 2011, 19:43

Ich finde das nicht sehr sinnvoll, weil das Dir so nicht helfen wird.

Grundsätzlich würde ich das wie folgt lösen und zwar mit einem Schalter, auf den reagiert wird:

Code: Alles auswählen

# PseudoCode
class Gui(object):

    schalter = 0

    dateien = {0 : "Erdgeschoss",
               1 : "1. OG",
               2 : "2. OG",
               }
    
    def click_button(self):

        if self.schalter == 0:
            self.schalter += 1
        elif self.schalter == 1:
            self.schalter += 1
        else:
            self.schalter = 0

    def zeige_geschoss(self):

        return self.dateien[self.schalter]

if __name__ == "__main__":

    gui = Gui()

    geschoss = gui.zeige_geschoss()
    print("Sie sind im {}".format(geschoss))

    for i in range(5):
        eingabe = input("Wechsel? 0 = Nein u. 1 = Ja : ")

        if eingabe == "0":
            pass
        else:
            gui.click_button()

        geschoss = gui.zeige_geschoss()
        print("Sie sind im {}".format(geschoss))
Durch Klicken des Buttons hoch, kannst du den Schalter-Zähler um jeweils eins erhöhen. Durch Klicken des Buttons runter (ich habe mir das gespart), würde ich den Schalter-Zähler um jeweils eins minimieren. Werden dann die Dateien angezeigt, dann fragst du im Programm (z. B. gebunden über ein Event) den Inhalt der Variable ab und gibst entsprechenden Inhalt zurück.

Nur mal so am Rande: Runter und Hoch macht m. E. Sinn, wenn du einen bestimmten Pfad entlanggehen willst. Wenn du aber mehrere Dateien zur Auswahl hast und ein Benutzer aus verschiedenen Dateien auswählen kann, dann verstehe ich nicht, wie du das mit einem Button "Runter" abfangen willst.

Ist Dir die Programmlogik klar?
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@pixewakb: auch"pseudo"-Code sollte die grundsätzlichen Konventionen einhalten. Klassenattribute sind kein Weg um Instanzattribute zu initialisieren. Und eine main-Funktion zu benutzen, schadet auch nichts.
Benutzeravatar
pixewakb
User
Beiträge: 1412
Registriert: Sonntag 24. April 2011, 19:43

Klassenattribute sind kein Weg um Instanzattribute zu initialisieren.
Der Code oben ist grob so, wie ich das gemacht hätte. Was genau mache ich da falsch? Du hättest gern den Inhalt von dateien erst bei der Initialisierung der Klasse reingebracht? Wo hättest du die main()-Funktion rein gesetzt? Wenn ich nur mit Funktionen arbeite, dann schreibe ich mir schon mal häufiger eine main()-Funktion, aber bei Klassen habe ich das bislang nicht gemacht.
BlackJack

@pixewakb: Genau falsch sind die Klassenattribute, also zumindest `schalter` (was ein komischer Name für ganze Zahlen ist) gehört nicht auf die Klasse sondern ein Exemplar und bei `dateien` sollte man mindestens durch den Namen kennzeichnen dass es sich um eine Konstante Datenstruktur handelt die nicht verändert werden darf. Aber auch das hätte ich in die `__init__()` verlegt, damit man da dynamisch auch andere Daten übergeben kann.

Das Wörterbuch ist die falsche Struktur für etwas das ganze Zahlen von 0 bis … auf Werte abbildet, das macht ja schon die Liste.

Die `click_button()` ist nicht wirklich einfach erweiterbar, hängt nicht von der tatsächlichen Anzahl der Daten ab, und ist viel zu umständlich geschrieben. Der Ausdruck ``self.schalter = (self.schalter + 1) % len(self.dateien)`` leistet das gleiche, und man muss an der Methode nichts ändern wenn man Dateien hinzufügt oder löscht.
Antworten