gobject idle funktioniert nicht so richtig

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
gugugs
User
Beiträge: 113
Registriert: Dienstag 30. Dezember 2008, 12:38

Beitragvon gugugs » Samstag 31. Januar 2009, 17:33

Ich kann wenn ich in einer Thread Klasse bin eine Funktion aufrufen, die in einer ganz anderen Klasse ist??? Mir sagt er dann, das es diese Funktion nicht gibt.
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Beitragvon Trundle » Samstag 31. Januar 2009, 17:35

gugugs hat geschrieben:Wäre vllt jemand so nett mir auf die Sprünge zu helfen?^^

[mod]threading[/mod] lesen, und zwar "Thread Objects". Was die Thread-Klasse so an Argumenten entgegen nimmt dürfte beispielsweise recht interessant für dich sein.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Beitragvon numerix » Samstag 31. Januar 2009, 17:36

gugugs hat geschrieben:Ich kann wenn ich in einer Thread Klasse bin eine Funktion aufrufen, die in einer ganz anderen Klasse ist??? Mir sagt er dann, das es diese Funktion nicht gibt.


Was genau "sagt er" denn? Das, was "er sagt", dürfte mit den Threads an sich wenig zu tun haben. Am besten zeigst du mal den entsprechenden Code und den Traceback.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Samstag 31. Januar 2009, 17:36

gugugs hat geschrieben:Ich kann wenn ich in einer Thread Klasse bin eine Funktion aufrufen, die in einer ganz anderen Klasse ist??? Mir sagt er dann, das es diese Funktion nicht gibt.

Code: Alles auswählen

instanz = Klasse()
instanz.methode()


Das funktioniert auch in Threads. Ansonsten solltest du Code posten, denn deine Beschreibung führt nicht dazu, dass irgendetwas klarer wird. Eher im Gegenteil.
gugugs
User
Beiträge: 113
Registriert: Dienstag 30. Dezember 2008, 12:38

Beitragvon gugugs » Samstag 31. Januar 2009, 17:43

Hm, das ist leider vllt ein bisschen schlecht den ganzen Code zu posten, da dieser momentan 1000 Zeilen umfasst.

Aber jetzt nur mal als Theorie, ginge dieses Prinzip?:

klasse thread(threading.Thread)
funktion__init__(self)
threading.Thread.__init__(self)

funktion run(self)
self.eins anzeigen?
self.zwei anzeigen?

klasse programm
funktion __init__(self)
self.eins
self.zwei
self.drei
thread=thread
thread.start()



ginge das nach dem Prinzip so?

P.s.: Falls es einer vorher unvollständig gelesen hat, bin ausversehen zu früh auf senden gekommen
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Samstag 31. Januar 2009, 18:04

Was ist denn ``self.eins``. Wenn du darauf zugreifen willst, musst du es der Threadklasse zum Beispiel als Parameter mitgeben.
gugugs
User
Beiträge: 113
Registriert: Dienstag 30. Dezember 2008, 12:38

Beitragvon gugugs » Samstag 31. Januar 2009, 18:12

ja genau das meine ich ja... was ist wenn aber jetzt self.eins eine funktion ist also z.B.:

klasse thread(threading.Thread)
funktion__init__(self)
threading.Thread.__init__(self)

funktion run(self)
funktion eins ausführbar? (nein)
self.zwei anzeigen?

klasse programm
funktion __init__(self)
funktion eins(self):
print "hallo"
self.zwei
self.drei
thread=thread
thread.start()


das meine ich ja variablen kann ich ja als parameter übergebn, aber was ist mit Funktionen, was ist wenn ich in der Thread Klasse eine Funktion benutzen will, die in der Klasse programm (das Beispiel) definiert wurde und eine instanz von der klasse programm ist?
EyDu
User
Beiträge: 4866
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Samstag 31. Januar 2009, 18:19

Dann übergibst du die Instanz als Parameter und speicherst diese als Attribut. Dann kannst du sie mit

Code: Alles auswählen

self.inst.eins()


aufrufen.

Von Vorteil wäre es, wenn du deinen Code noch zwischen die entsprechenden Code-Tags setzen könntest. Und natürlich richtigen Python-Code zu verwenden.

Edit:

Code: Alles auswählen

class Thread(threading.Thread):
    def __init__(self, programm):
        threading.Thread.__init__(self)
        self.programm = programm

    def run(self):
        self.programm.eins()

class Programm:
    def eins(self):
        print "hallo"

programm = Programm()
thread=Thread(programm )
thread.start()
gugugs
User
Beiträge: 113
Registriert: Dienstag 30. Dezember 2008, 12:38

Beitragvon gugugs » Samstag 31. Januar 2009, 18:31

Suuper, jetzt hab ichs verstanden. Vielen Danke für die ganze Geduld, und letzte perfekte Erklärung

Sry das es kein Code war, wollte ein schnelles Beispiel haben
gugugs
User
Beiträge: 113
Registriert: Dienstag 30. Dezember 2008, 12:38

Beitragvon gugugs » Samstag 31. Januar 2009, 21:16

Tut mir leid, dass ich noch mal das Thema stören muss, aber wenn ich die Klasse oder Funktion so an den Thread weiter gebe, dann wird die Funktion schon beim weitergeben an den Thread aufgerufen, kann ich das irgendwie so machen, das diese erst aufgerufen wird, wenn ich sie im Thread aufrufe, und nicht schon bei der Übergabe?
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Samstag 31. Januar 2009, 21:42

Minimalbeispiel mit Code? Weil normalerweise passiert sowas nicht, wenn du eine Klasse oder Funktion herumreichst, es scheint dass du sie nicht übergibst, sondern aufrufst.
gugugs
User
Beiträge: 113
Registriert: Dienstag 30. Dezember 2008, 12:38

Beitragvon gugugs » Samstag 31. Januar 2009, 21:49

Das mit dem Code posten, ist wirklich ein Problem, da es knapp 1000 Zeilen sind, und es alles verteilt ist, aber vom prinzip her hab ich 2 Klassen die eine ist die Thread Klasse, und die 2. die programm Klasse, die auch zu erst aufgerufen wird, da dort das Fenster und alle mögliche gemacht wird wird, wenn ich jetzt so mache, wie EyDu es schon beschrieben hat:

Code: Alles auswählen

class Thread(threading.Thread):
    def __init__(self, programm):
        threading.Thread.__init__(self)
        self.programm = programm

    def run(self):
        self.programm.eins()

class Programm:
    def eins(self):
        print "hallo"

programm = Programm()
thread=Thread(programm )
thread.start()


Dann startet sich mein ganzes Fenster neu, hat das was damit zu tun, das ich in der Funktion programm, also in der Hauptfunktion eine __init__ drin habe, für das Fenster?
Denn ich habe es ganz genauso gemacht, wie in dem Beispiel von EyDu beschrieben

edit: allein wenn ich schon programm=programm() dann wird die Klasse neu aufgerufen, und ein neues Fenster erscheint

Wenn ich es so mache:

Code: Alles auswählen

class Thread(threading.Thread):
    def __init__(self, programm):
        threading.Thread.__init__(self)
        self.programm = programm

    #def run(self):
        #self.programm.eins()

class Programm:
   def eins(self):
      print "hallo"
      
print "hallo"

programm = Programm()
thread=Thread(programm )
thread.start()


dann erscheint auch hallo, also scheinbar alles was nicht in einer Funktion ist, wird neu aufgerufen
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Samstag 31. Januar 2009, 22:47

Natürlich dass bei letzteren Beispiel auch ``hallo`` erscheint, du hast mitten im Modul ein ``print 'Hallo'``.

Code: Alles auswählen

import threading

class Thread(threading.Thread):
    def __init__(self, programm):
        threading.Thread.__init__(self)
        self.programm = programm

    def run(self):
        self.programm.eins()

class Programm:
    def eins(self):
        print "hallo"

programm = Programm()
thread = Thread(programm)
thread.start()

(So sieht ein Minimalbeispiel aus, also auch mit allen nötigen Imports) verhält sich genau so wie ich es erwarten würde. Was würdest du denn hier erwarten?
gugugs
User
Beiträge: 113
Registriert: Dienstag 30. Dezember 2008, 12:38

Beitragvon gugugs » Samstag 31. Januar 2009, 23:06

Ja, stimmt ist mir dann auch aufgefallen, hab es jetzt auch so gemacht. Aber mir fällt auf, das selbst wenn in der Thread Klasse eine Funktion von der Programm Klasse aufgerufen wird, das die Programm Klasse zum Stillstand kommt, also mein Knopf immer noch gedrückt bleibt
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Samstag 31. Januar 2009, 23:52

Nunja, wie schon öfter gesagt, ohne einen Quellcode von dir der ein minimales, lauffähiges Beispiel zeigt (du kannst das etwa in das Pocoo-Pastebin laden) ist es nur schwer dir zu helfen.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder