GTK Entry Auslesen beim Klick auf Button

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
Benutzeravatar
beli3ver
User
Beiträge: 27
Registriert: Mittwoch 2. März 2016, 05:33
Kontaktdaten:

Guten Morgen,

ich weiß es gibt einen ähnlichen Beitrag.
Jedoch nutze ich keine Builder, deswegen ein neuer Beitrag.

Ich habe eine Klasse die beim Aufruf ein Fenster erstellt mit einem Gtk.Entry:

Code: Alles auswählen

class Customer(Gtk.Box):

    def __init__(self, parent):
        Gtk.Box.__init__(self, False, 0)
        self.parent = parent
        self.set_border_width(10)
        self.set_orientation(Gtk.Orientation.VERTICAL)
        
        customerzip_entry = Gtk.Entry()
        
        btn_add_customer = Gtk.Button.new_with_label("Next")
        btn_add_customer.connect("clicked", self.btn_add_customer_clicked)
        
        self.add(customerzip_entry)
        self.add(btn_add_customer)
        
Beim klicken auf Next möchte ich jetzt den Wert von dem Entry auslesen, damit ich diesen Speichern will:

Code: Alles auswählen

    def btn_add_customer_clicked(self, widget):

        customer = {
            'Zip': self.customerzip_entry.get_text()
        }

        df = DataFrame(customer, index=[0])

        export_csv = df.to_csv(r'cus.csv',
                                index=None,
                                header=False,
                                sep="/")

        self.parent.stack.set_visible_child_name("invoice")
  
Wenn ich das so ausführe, bekomme ich immer diese Fehlermeldung:
AttributeError: 'Customer' object has no attribute 'customerzip_entry'
Kann mir hier jemand weiterhelfen?
Danke
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@beli3ver: Das ist ja auch recht offensichtlich wahr. Es gibt nur ein `customerzip_entry` und das ist kein Attribut sondern einfach nur ein lokaler Name in der `Customer.__init__()`.

Was soll denn das `False` beim `Gtk.Box.__init__()`-Aufruf bedeuten? Da gehört die Ausrichting hin, also `Gtk.Orientation.VERTICAL`. `False` hat als Zahl den Wert 0, also zufällig den gleichen Wert wie `Gtk.Orientation.HORIZONTAL`:

Code: Alles auswählen

In [17]: int(False)                                                             
Out[17]: 0

In [18]: int(Gtk.Orientation.HORIZONTAL)                                        
Out[18]: 0

In [19]: False == Gtk.Orientation.HORIZONTAL                                    
Out[19]: True
`__init__()` mit Positionsargumenten aufzurufen ist „deprecated“, sollte also nicht mehr verwendet werden. Man sollte entweder eine der spezifischeren Initialisierungsmethoden aufrufen oder Schlüsselwortargumente verwenden. Bei letzterem kann man dann auch gleich die Rahmengrösse bei dem Aufruf setzen.


Namen sollten keine kryptischen Abkürzungen enthalten. Wenn man `button` meint, sollte man nicht `btn` schreiben. Und das dann auch an die richtige Stelle. Ausser man heisst Yoda. ;-)

Der Rückgabewert von `DataFrame.to_csv()` ist `None` wenn man einen Dateinamen oder ein Dateiobjekt beim Aufruf übergibt. Es macht keinen Sinn den an einen Namen zu binden. Wobei `pandas` eine ziemliche Kanone in diesem Fall ist, nur um Daten zu einem Kunden als CSV zu speichern. In der Standardbibliothek gibt es ein `csv`-Modul.

Das `parent`-Attribut richt komisch. Widgets sollten nicht so viel über die übergeordnete Hierarchie wissen und nicht da rein greifen und etwas machen.

Ungetestet:

Code: Alles auswählen

class Customer(Gtk.Box):
    def __init__(self, parent):
        Gtk.Box.__init__(
            self,
            orientation=Gtk.Orientation.VERTICAL,
            spacing=0,
            border_width=10,
        )
        self.parent = parent

        self.zip_entry = Gtk.Entry()

        add_customer_button = Gtk.Button.new_with_label("Next")
        add_customer_button.connect(
            "clicked", self.add_customer_button_clicked
        )

        self.add(self.zip_entry)
        self.add(add_customer_button)

    def add_customer_button_clicked(self, _widget):
        customer = {'Zip': self.zip_entry.get_text()}
        dataframe = DataFrame(customer, index=[0])
        dataframe.to_csv("cus.csv", index=None, header=False, sep="/")
        self.parent.stack.set_visible_child_name("invoice")
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten