Go 和 Fyne 新手,并且跌跌撞撞地試圖從 Fyne 中獲取我需要的東西。抱歉,這會(huì)很長(zhǎng)。我的問(wèn)題是這樣的。我正在編寫一個(gè)應(yīng)用程序,它從服務(wù)器獲取命令列表,告訴它創(chuàng)建一系列小部件并顯示它們。它們有多種類型——標(biāo)簽、按鈕、條目、選擇等。但這些不是標(biāo)準(zhǔn)的小部件;而是標(biāo)準(zhǔn)的小部件。我需要稍微擴(kuò)展一下他們的行為。一方面,當(dāng)用戶操作時(shí),他們每個(gè)人都需要訪問(wèn)一些每個(gè)小部件的信息。例如,單擊按鈕必須引用特定于該按鈕的一些數(shù)據(jù),以便它知道要做什么。我們將此附加信息稱為“About”結(jié)構(gòu)。其次,每個(gè)小部件都需要能夠右鍵單擊并下拉小部件特定的菜單。是的,即使按鈕和標(biāo)簽也需要能夠提供下拉菜單。對(duì)于像 Entry 這樣的小部件,我知道這種設(shè)計(jì)將使我必須為粘貼、復(fù)制和 Entry 通常通過(guò)右鍵單擊提供的其他操作編寫自己的菜單選項(xiàng),但我對(duì)此表示同意。我已經(jīng)完成了所有這些工作,但在這個(gè)過(guò)程中我破壞了 Select(并且其他小部件可能也會(huì)損壞。)并且我不知道如何修復(fù)它。問(wèn)題:嘗試發(fā)送 Select 小部件會(huì)導(dǎo)致恐慌:界面轉(zhuǎn)換:fyne.Canvas 為零,而不是 *glfw.glCanvas方法:type GenericWidget struct { fyne.Widget //I’m some kind of widget about *About //here’s my personal “About” data //function pointers OnRightClickp func(gw *GenericWidget, pe *fyne.PointEvent) OnLeftClickp func(gw *GenericWidget, pe *fyne.PointEvent) …other “function pointers” for OnRunep and so on…}現(xiàn)在我必須捕獲所有“事件”,以便 GenericWidget 能夠看到它們:func (gw *GenericWidget) TappedSecondary(pe *fyne.PointEvent) { if (gw.OnRightClickp != nil) {gw.OnRightClickp(gw, pe)}}func (gw *GenericWidget) Tapped(pe *fyne.PointEvent) { if (gw.OnLeftClickp != nil){gw.OnLeftClickp(gw, pe)}}//type Focusable interface//etc….這應(yīng)該代表任何單個(gè)小部件,無(wú)論類型如何。這并不復(fù)雜:當(dāng)驅(qū)動(dòng)程序調(diào)用 Taped 時(shí),會(huì)調(diào)用 GenericWidget.Tapped。如果此小部件設(shè)置了“OnLeftClickp”函數(shù)指針,則調(diào)用它。至關(guān)重要的是,當(dāng)發(fā)生這種情況時(shí),我們傳遞一個(gè)指向小部件本身的指針,因?yàn)槲揖帉懙乃惺录幚沓绦蚨夹枰L問(wèn) *About 以及我添加到 GenericWidget 的其他任何內(nèi)容。當(dāng)需要?jiǎng)?chuàng)建標(biāo)簽時(shí),我會(huì)這樣做并將其折疊到 GenericWidget 中所有這些 GenericWidget 都工作正常 - 我將它們添加到適當(dāng)?shù)?Box 中,并且窗口按照我的預(yù)期進(jìn)行繪制。我可以右鍵單擊標(biāo)簽,如果設(shè)置了 OnRightClickp(通常是這樣),代碼將被調(diào)用并被授予對(duì) *GenericWidget 的訪問(wèn)權(quán)限,這會(huì)導(dǎo)致 *About,這意味著放置的菜單可以為以下內(nèi)容提供所有正確的內(nèi)容這個(gè)標(biāo)簽上有什么。當(dāng)然,Labels 通常不關(guān)心點(diǎn)擊,因此我竊取了 Tappable 中的所有調(diào)用這一事實(shí)并不重要。但是 Select 小部件確實(shí)關(guān)心左鍵單擊,因此 GenericWidget 攔截對(duì) Tapped() 的調(diào)用這一事實(shí)意味著我永遠(yuǎn)不會(huì)看到下拉菜單出現(xiàn)。編譯正常,選擇顯示,但是當(dāng)我左鍵單擊時(shí),它會(huì)打印預(yù)期的“選擇點(diǎn)擊”,然后立即出現(xiàn)恐慌:select tappedpanic: interface conversion: fyne.Canvas is nil, not *glfw.glCanvas我迷路了。我的 GenericWidget 只是一個(gè)小部件;我認(rèn)為這就是組合所做的,我創(chuàng)建的所有 GenericWidget 都放在一個(gè) Box 中,該 Box 位于窗口中的 SetContent 框中。但該錯(cuò)誤向我表明,不知何故,此 Select 對(duì)象設(shè)置不正確,當(dāng)它繪制選項(xiàng)時(shí),缺少某些內(nèi)容。我做錯(cuò)了什么?我的整個(gè)方法可能是錯(cuò)誤的(我做了很多 C++ 和 Python 工作,并且我對(duì)事物采取面向?qū)ο蟮挠^點(diǎn))。在這種情況下,我該如何做這一切呢?
2 回答

慕沐林林
TA貢獻(xiàn)2016條經(jīng)驗(yàn) 獲得超9個(gè)贊
看起來(lái)不像正在撰寫選擇 - 您的擴(kuò)展選擇只是創(chuàng)建一個(gè)新選擇,稍后再點(diǎn)擊它。
崩潰是由于它試圖在畫布上找不到的選擇旁邊顯示彈出窗口。
如果您要擴(kuò)展內(nèi)置小部件,您還需要調(diào)用 ExtendBaseWidget,以便驅(qū)動(dòng)程序可以查找您的小部件而不是默認(rèn)的小部件。也就是說(shuō),可以擴(kuò)展任何其他類型的小部件的單個(gè)小部件違反了 Fyne API 的強(qiáng)類型設(shè)計(jì),您可能會(huì)遇到麻煩。
- 2 回答
- 0 關(guān)注
- 182 瀏覽
添加回答
舉報(bào)
0/150
提交
取消