Aus einer Funktion eine andere aufrufen, GTK widget

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
martinjo
User
Beiträge: 186
Registriert: Dienstag 14. Juni 2011, 20:03

Guten Abend oder guten Morgen,

ich habe ein Programm mit einer Klasse die mehrere Funktionen enthält. Diese Funktionen definiere ich mit def funktion(self, widget). Aufgerufen werden die Funktionen aus dem Hauptprogramm (def __init__(self):) mit self.funktion(). Möchte ich nun aus einer dieser Funktionen eine andere aufrufen, bekomme ich die Meldung, dass ein Parameter zu wenig übergeben wurde.

Ist dies nun self oder widget? Und wie kann ich das Problem verhindern? Ich kann eine leere Variabel mitgeben, also ist es wohl widget. So funktioniert es auch, aber schön ist das nicht. Und vor allem auch nicht richtig. Aber ich tue mich bei diesem Thema noch etwas schwer (Klassen).

Freue mich wie immer über Hilfe und Kommentare zu dem Thema. Danke
Benutzeravatar
diesch
User
Beiträge: 80
Registriert: Dienstag 14. April 2009, 13:36
Wohnort: Brandenburg a.d. Havel
Kontaktdaten:

Wenn du eine Methode mit

Code: Alles auswählen

def funktion(self, widget)
definierst, musst du sie mit

Code: Alles auswählen

self.funktion(widget)
aufrufen.

Als ersten Parameter bekommen Methoden immer "automagisch" die zugehörige Instanz oder Klasse übergeben, alle anderen Parameter musst du selbst angeben.

"widget" ist ein ganz normaler Parameter. Wenn deine Methode ihn nicht benötigt und keine Methode überschreibt, die ihn benötigt , kannst du ihn bei der Definition der Methode einfach weglassen.
http://www.florian-diesch.de
BlackJack

@martinjo: Ich nehme mal an Du hast das `widget`-Argument da weil Du es zwar nicht benutzt, aber andere es Dir unbedingt übergeben wollen, also zum Beispiel Rückrufe aus der GUI. Dann kannst Du einfach `None` als Default-Wert definieren:

Code: Alles auswählen

    def methode(self, _widget=None):
Den Unterstrich mache ich immer bei Argumenten die ich nicht verwende, die aber da sein müssen weil eine API das so vorgibt.

Du redest immer von Funktionen: Wenn das wirklich Funktionen sind, dann gehören sie nicht in eine Klasse.
Benutzeravatar
martinjo
User
Beiträge: 186
Registriert: Dienstag 14. Juni 2011, 20:03

Danke für die Antworten. @BlackHack, genau dass ist mein Problem gewesen.

Ich sende anbei noch den Code (teilweise) des Programms zu, daraus lassen sich wohl eher Rückschlüsse ableiten. Ich prüfe mit dem Progamm ob der Artikel in der Warenwirtschaft vorhanden ist (erp_search), wenn nicht kann ich diesen direkt aus dem Programm erstellen lassen (export2erp). Nun soll direkt nach dem Import nochmals geprüft werden, ob der Artikel nun vorhanden ist.

Code: Alles auswählen

#!/usr/bin/env python
#-*- coding: utf-8 -*-

import gtk
import sys
import time
import webbrowser
import subprocess

from decimal import *
from erp_con import Model
from urllib2 import urlopen


#import and check epr tool


#Basisklasse
class Base:
    # definiert das beenden
    def destroy(selb, widget, data=None):
        print "You Clicked the Close Button"
        gtk.main_quit()

    def erp_search(self, _widget=None):
        print "prüft ob Artikel in Warenwitschaft vorhanden ist."
        pass
        
    def export2erp(self, widget):
        name = self.product_name
        code = self.product_number
        Product = Model.get('product_product')
        product = Product()
        product.name = name
        product.code = code
        product.save()
        self.result_info_text.set_text("Exported to erp...")
        self.result_info_text.modify_fg(gtk.STATE_NORMAL, gtk.gdk.color_parse('#00b400'))
        self.erp_search()
        
    def __init__(self):
        #define windows
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.set_position(gtk.WIN_POS_CENTER)
        self.window.set_size_request(770, 570)
        self.window.set_title("product Parts Search Tool")
        
        #search entry and button
        self.search_entry_box = gtk.HBox()
        self.searchentry = gtk.Entry()
        self.searchentry.connect("activate", self.searchfunktion)
        self.search_entry_box.pack_start(self.searchentry)
        searchbutton = gtk.Button("   Search   ")
        searchbutton.connect("clicked", self.searchfunktion)
        self.search_entry_box.pack_start(searchbutton, expand=False)
        
        #Exit Button
        self.exitbutton = gtk.Button(stock = gtk.STOCK_QUIT)
        self.exitbutton.connect("clicked", self.destroy)
        self.exitbutton.set_tooltip_text("This is QUIT")

        #Product Name
        self.product_name_entry = gtk.Entry()
        self.product_name_entry.set_tooltip_text("Product Name")
    
        #Product Description
        self.scrolled_window_productinfo = gtk.ScrolledWindow(hadjustment=None, vadjustment=None)
        self.textview_productinfo = gtk.TextView()
        self.textview_productinfo.set_tooltip_text("Product Description")
        self.textbuffer_product_info = self.textview_productinfo.get_buffer()
        self.scrolled_window_productinfo.add_with_viewport(self.textview_productinfo)

        ##Search Button Box
        self.searchbuttonbox_h = gtk.HBox(homogeneous=True)
        searchbuttonbox_v = gtk.VBox()
        searchbuttonbox1_erpbutton = gtk.Button("Check erp")
        searchbuttonbox1_erpbutton.connect("clicked", self.erp_search)
        self.searchbuttonbox1_erp_count = gtk.Entry()
        self.searchbuttonbox1_erp_count.set_editable(False) 
        searchbuttonbox_v.pack_start(searchbuttonbox1_erpbutton)
        searchbuttonbox_v.pack_start(self.searchbuttonbox1_erp_count)
        self.searchbuttonbox_h.pack_start(searchbuttonbox_v)

        #Bereich (Box) festlegen und Inhalte festlegen
        self.box1 = gtk.VBox()
        self.box1.pack_start(self.search_entry_box, expand=False)
        self.box1.pack_start(self.product_name_entry, expand=False)
        self.box1.pack_start(self.scrolled_window_productinfo, expand=True)
        self.box1.pack_start(self.searchbuttonbox_h, expand=False)
        self.box1.pack_start(self.exitbutton, expand=False)

        #Box zum Hauptfenster hinzufügen und anzeigen
        self.window.add(self.box1)
        self.window.show_all()
        
        #schließen Knopf mit beenden Funktion verbinden
        self.window.connect("destroy", self.destroy)

    def main(self):
        gtk.main()

if __name__ == "__main__":
    base = Base()
    base.main()
Antworten