eigende klasse fehlermeldung

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
Satzende
User
Beiträge: 70
Registriert: Samstag 8. Januar 2011, 12:41

Hallo,

Wollte eine Eigen klasse in eine andere klasse doch nun gibt es da eine Fehlermeldung.
/home/vorname_mathias/workspace/gtk/src/Main.py:92: GtkWarning: gtk_box_pack: assertion `GTK_IS_WIDGET (child)' failed
self.vb.pack_start(self.inf)

Code: Alles auswählen

#-*- coding: UTF-8 -*-

import gtk

def_im = "/home/mathias/Bilder/logo.gif"


class imfra(gtk.Frame):

    def __init__(self,txt="None",pfad =  def_im):
        self.fra     = gtk.Frame()
        self.fra2    = gtk.Frame()
        self.vb      = gtk.VBox()
        self.ima     = gtk.Image()
        self.labe    = gtk.Label(txt)

        self.fra.add(self.vb)
        self.fra.show()
        self.fra2.add(self.ima)
        self.vb.pack_start(self.fra2)
        self.fra2.show()
        self.ima.set_from_file(pfad)
        self.ima.show()
        self.vb.pack_start(self.labe)
        self.labe.show()
        self.vb.show()
#scale fehlt noch

    def set_imag(self,pfad):
        self.ima.set_from_file(pfad)

    def set_lab_tetx(self,txt= "None"):
        self.labe.set_text(txt)



class myW(object):

    def __init__(self):
        self.window = gtk.Window()
        self.window.set_title("Der Titel")
        self.window.set_size_request(300,300)
        self.window.connect("delete_event", self.event_delete)
        self.window.connect("destroy", self.destroy)



        self.menu = gtk.Menu()

        self.menui = gtk.MenuItem("Hinzufügen")
        self.menui.show()
        self.menu.append(self.menui)

        self.menui = gtk.MenuItem("Bearbeiten")
        self.menui.show()
        #menui.connect()
        self.menu.append(self.menui)

        self.menui = gtk.MenuItem("Delete")
        self.menui.show()
        #menui.connect()
        self.menu.append(self.menui)

        self.menui = gtk.MenuItem("Exit")
        self.menui.show()
        #menui.connect()
        self.menu.append(self.menui)

        self.mainMenu = gtk.MenuItem("Main")
        self.mainMenu.set_submenu(self.menu)
        self.mainMenu.show()
        #menui.connect()


        self.menuBar = gtk.MenuBar()
        self.menuBar.append(self.mainMenu)
        self.menuBar.set_size_request(50,50)
        self.menuBar.show()
        self.vb = gtk.VBox()
        self.vb.pack_start(self.menuBar,False,False,0)

        self.lay = gtk.Layout(None,None)
        self.lay.show()
        self.vb.pack_start(self.lay,False,False,0)

        #scrollbat
        self.hScrollbar = gtk.HScrollbar(None)
        self.hScrollbar.show()
        self.vb.pack_start(self.hScrollbar,False,False,0)

        self.inf = imfra()
        self.vb.pack_start(self.inf)
        

        self.vb.show()
        self.window.add(self.vb)
        self.window.show()


    def event_delete(self, widget, event, data=None):
        return False

    def destroy(self, data=None):
        gtk.main_quit()

    def main(self):
        gtk.main()



i = myW()
i.main()
gute nacht und danke fürs lesen
Zuletzt geändert von Anonymous am Montag 17. Oktober 2011, 22:14, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Du hast vergessen die Basisklasse zu initialisieren:

Code: Alles auswählen

class imfra(gtk.Frame):
    def __init__(self,txt="None",pfad =  def_im):
        gtk.Frame.__init__(self)
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
Satzende
User
Beiträge: 70
Registriert: Samstag 8. Januar 2011, 12:41

Sieht stark nach einem Fall von fehlendem Grundwissen aus.
Danke für die Hilfe

Edit:

Mag deshalb nicht noch ein Thema auf machen. Meine eigenen Klassen erzeugen zwar nun keinen Fehler mehr aber sie werden auch nicht darstellt.

kleines beispiel:

Code: Alles auswählen

import gtk

class bild(gtk.Image):
    
    def __init__(self):
        gtk.Image.__init__(self)
        self.im = gtk.Image()
        self.im.set_from_file("/home/mathias/Bilder/abc.jpg")
        self.im.show()

window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.set_default_size(300,200)
window.show()
bil = bild()
bil.show()
window.add(bil)

gtk.main()
wäre klasse wenn jemand dazu noch ein oder 2 Sätze schreiben könnte
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Hier fehlt wohl immer noch Grundwissen, du erzeugt ein Image, obwohl deine abgeleitete Klasse selbst schon ein Image ist. Macht irgendwie keinen Sinn. So dürfte es funktionieren:

Code: Alles auswählen

class Bild(gtk.Image):
# Klassennamen immer groß!
    
    def __init__(self):
        gtk.Image.__init__(self)
        self.set_from_file("/home/mathias/Bilder/abc.jpg")
        self.show()
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
Satzende
User
Beiträge: 70
Registriert: Samstag 8. Januar 2011, 12:41

Hier fehlt wohl immer noch Grundwissen, du erzeugt ein Image, obwohl deine abgeleitete Klasse selbst schon ein Image ist. Macht irgendwie keinen Sinn. So dürfte es funktionieren:
Das sehe ich genau so. Lustigerweise habe ich gestern , bevor ich den Beitrag geschrieben habe habe, das durchgearbeitet.
Lesen reicht nicht verstehen muss man es halt auch.

Danke für die helfende Antwort @ms4py
deets

@Satzende:

Das Galileo Open-Book ist nach uebereinstimmender Ansicht aller Forumsgroessen hier eher besch...eiden. Und dein Link illustriert das auch sehr schoen.

Such dir lieber was anderes - learn Python the hard way zB.
Satzende
User
Beiträge: 70
Registriert: Samstag 8. Januar 2011, 12:41

Bin halt auf ,in Deutsch gehaltenes Material angewiesen. Nicht englisch zu können ist nicht unbedingt eine Grundvoraussetzung zum programmieren.

Aber nun nervt mich das ich, mal wider, alleine nicht weiter komme. Die klasse soll so aussehen:
In einem Frame soll ein Label und ein Image. zur Positionierung eine Vbox.
Eine eigene Klasse von Frame abzuleiten ist nun kein Problem mehr. Will ich nun aber, als Beispiel, nur ein Image in dieses Frame Bringen geht das nicht.

Hab es mit ableiten von beiden Klassen versucht(Mehrfachvererbung)

Code: Alles auswählen

    
class fra(gtk.Frame,gtk.Image):
    def __init__(self):
        gtk.Frame.__init__(self)
        gtk.Image.__init__(self)#Fragwürdige Zeile
        
        
        self.add(self.set_from_file("/home/mathias/Bilder/abc.jpg"))
        
EIne Instanz des Images in der abgeleiteten Klasse bilden

Code: Alles auswählen

    
class fra(gtk.Frame):
    def __init__(self):
        gtk.Frame.__init__(self)        
        self.img = gtk.Image()
        self.img.set_from_file("/pfad/zum/Billd")
        
        self.add(self.img)
        
Alles nichts gebracht

P.s.Hab schon ein schlechtes gewissen weil ich hier immer rumheule.
deets

Satzende hat geschrieben:Bin halt auf ,in Deutsch gehaltenes Material angewiesen. Nicht englisch zu können ist nicht unbedingt eine Grundvoraussetzung zum programmieren.
Ganz bestimmt ist nicht Englisch zu koennen keine Grundvorraussetzung zum Programmieren. Sonst koennten ja keine Englisch-Sprecher Programmieren lernen... ein bisschen Aussagenlogik zu beherrschen hingegen ist schon nicht schlecht.. ;)

Und es gibt IMHO nix besseres, als die Motivation etwas lernen zu wollen (bei dir sowie bei mir eben Programmieren) als Vehikel zu benutzen, sich Englisch beizubringen. Das hat mich von meiner 5+ in der Schule zu einem fast-schon-native-speaker gemacht (nach Aussage von selbigen, nicht meiner selbst). Vielleicht ueberlegst du dir das also nochmal mit den englischen Buechern. Vor allem, wenn die deutsche Alternative (im konkreten jetzt das Galileo Buch) dir eh Bloedsinn beibringt.

Und zu deinem Problem: Ich habe wenig GTK-Erfahrung, aber ableiten von *zwei* Klassen - was soll denn dabei dann gelungenes rumkommen? Wenn, dann solltest du nur von gtk.Image ableiten, wie ich das aus deiner Problembeschreibung (uebrigens auch nicht gerade ein Muster an Klarheit und gutem Deutsch) ersehe.
Satzende
User
Beiträge: 70
Registriert: Samstag 8. Januar 2011, 12:41

ich habe das mit den von 2 Klassen erben herum experimentiert. Ziel ist es das ich in meiner klasse widgets verbaue und so quasi ein eignendes widget zu erhalten.
Funktionieren tut das eben nicht. Erbe ich von gtk.frame und füge in der klasse dann ein gtk.Image hinzu dann funktioniert das eben nicht

Edit: der Fehler sitzt vor dem Pc. Die Dinge wahren schon da nur eben nicht sichtbar. Einmal Show_all() und fertig :oops: :roll:
Antworten