2017-10-24 3 views
1

Ich habe diesen Code zusammengefasst, um Registerkarten in einem Notebook in Gtk anzuzeigen. Im Grunde habe ich eine benutzerdefinierte Struktur mit einem eingebetteten Label erstellt, das dem Notebook hinzugefügt wird. Danach möchte ich dieses benutzerdefinierte Widget zurückbekommen, aber ich bekomme eine Invalid type assertion. Ich habe viel über Strukturen und Schnittstellen gelesen, aber ich kann es nicht zum Laufen bringen.Gotk3, Notebook Appendpage mit einem benutzerdefinierten Widget und bekomme es zurück

package main 

import "github.com/gotk3/gotk3/gtk" 

type NotebookPage struct { 
    gtk.Label 
} 


func main() { 

    gtk.Init(nil) 

    win, _ := gtk.WindowNew(gtk.WINDOW_TOPLEVEL) 

    notebook, _ := gtk.NotebookNew() 
    win.Add(notebook) 

    content1, _ := gtk.LabelNew("Content 1") 
    page1 := NotebookPage{Label: *content1} 
    label1, _ := gtk.LabelNew("Label 1") 
    notebook.AppendPage(&page1, label1) 

    content2, _ := gtk.LabelNew("Content 2") 
    page2 := NotebookPage{Label: *content2} 
    label2, _ := gtk.LabelNew("Label 2") 
    notebook.AppendPage(&page2, label2) 

    win.ShowAll() 
    win.Connect("destroy", func() { 
     gtk.MainQuit() 
    }) 

    backwidget1, _ := notebook.GetNthPage(0) 
    backpage1, _ := backwidget1.(*NotebookPage) 

    gtk.Main() 

} 
+0

Was ist der vollständige Fehler, den Sie erhalten? –

+0

Zum Zeitpunkt der Kompilierung test.go: 35: unzulässige Typ-Zusicherung: backwidget1. (* NotebookPage) (Nicht-Schnittstellentyp * gtk.Widget auf der linken Seite) – okelet

+1

Typ-Zusicherungen funktionieren nur bei Schnittstellentypen. '. ()' oder '. ()'. Sie können einen konkreten Typ nicht auf einen anderen Typ, eine andere Schnittstelle oder auf andere Weise eingeben. Aus der Fehlermeldung, es scheint, dass "Backwidget1" ist ein konkreter Typ (eine Struktur, am wahrscheinlichsten), keine Schnittstelle, so dass Ihre Typ-Assertions ungültig sind. Außerdem überprüfen Sie nicht den booleschen zweiten Wert Ihrer Typassertionen (das '_'), der Ihnen sagen würde, ob die Typbestätigung erfolgreich war. Wenn nicht, ist 'backpage1' gleich Null. Sie sollten diesen booleschen Wert wirklich überprüfen. – Kaedys

Antwort

1

Sieht aus wie Ihr Problem Linie hier auf 35 als Nachricht ist, sagt:

backpage1, _. = Backwidget1 (* NotebookPage)

notebook.GetNthPage gibt ein * Widget * NotebookPage ist kein * Widget, also darfst du nicht darauf zugreifen. Wenn die Funktion keinen konkreten Typ zurückgegeben hat (wenn sie die gleiche IWidget-Schnittstelle zurückgegeben hat) und wenn sie nicht durch gtk C-Bibliotheken zurückgerollt ist, könnten Sie dies tun.

Wenn Sie Ihr benutzerdefiniertes Widget zurückbekommen möchten, müssen Sie wahrscheinlich das zugrunde liegende gtk-Widget oder die Serialisierung (die vermutlich Ihr benutzerdefiniertes Etikett speichert), das Label extrahieren und eine neue NotebookPage erstellen.

Sie müssen also so etwas wie:

func NewNotebookPage(widget *Widget) { 
    return &NotebookPage{Label: widget.GetLabelSomehow()} 
} 

Es ist wie Label-aussieht, ist auch ein Widget :) Das ist schmerzhaft, weil es versucht, mit C++ Vererbung in Go zu arbeiten. Sie müssen herausfinden, wie Sie Ihr Etikett aus dem Widget entfrieren.C.GtkWidget

Verwandte Themen