Go 和 Fyne 新手,并且跌跌撞撞地試圖從 Fyne 中獲取我需要的東西。抱歉,這會很長。我的問題是這樣的。我正在編寫一個應用程序,它從服務器獲取命令列表,告訴它創建一系列小部件并顯示它們。它們有多種類型——標簽、按鈕、條目、選擇等。但這些不是標準的小部件;而是標準的小部件。我需要稍微擴展一下他們的行為。一方面,當用戶操作時,他們每個人都需要訪問一些每個小部件的信息。例如,單擊按鈕必須引用特定于該按鈕的一些數據,以便它知道要做什么。我們將此附加信息稱為“About”結構。其次,每個小部件都需要能夠右鍵單擊并下拉小部件特定的菜單。是的,即使按鈕和標簽也需要能夠提供下拉菜單。對于像 Entry 這樣的小部件,我知道這種設計將使我必須為粘貼、復制和 Entry 通常通過右鍵單擊提供的其他操作編寫自己的菜單選項,但我對此表示同意。我已經完成了所有這些工作,但在這個過程中我破壞了 Select(并且其他小部件可能也會損壞。)并且我不知道如何修復它。問題:嘗試發送 Select 小部件會導致恐慌:界面轉換: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…}現在我必須捕獲所有“事件”,以便 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….這應該代表任何單個小部件,無論類型如何。這并不復雜:當驅動程序調用 Taped 時,會調用 GenericWidget.Tapped。如果此小部件設置了“OnLeftClickp”函數指針,則調用它。至關重要的是,當發生這種情況時,我們傳遞一個指向小部件本身的指針,因為我編寫的所有事件處理程序都需要訪問 *About 以及我添加到 GenericWidget 的其他任何內容。當需要創建標簽時,我會這樣做并將其折疊到 GenericWidget 中所有這些 GenericWidget 都工作正常 - 我將它們添加到適當的 Box 中,并且窗口按照我的預期進行繪制。我可以右鍵單擊標簽,如果設置了 OnRightClickp(通常是這樣),代碼將被調用并被授予對 *GenericWidget 的訪問權限,這會導致 *About,這意味著放置的菜單可以為以下內容提供所有正確的內容這個標簽上有什么。當然,Labels 通常不關心點擊,因此我竊取了 Tappable 中的所有調用這一事實并不重要。但是 Select 小部件確實關心左鍵單擊,因此 GenericWidget 攔截對 Tapped() 的調用這一事實意味著我永遠不會看到下拉菜單出現。編譯正常,選擇顯示,但是當我左鍵單擊時,它會打印預期的“選擇點擊”,然后立即出現恐慌:select tappedpanic: interface conversion: fyne.Canvas is nil, not *glfw.glCanvas我迷路了。我的 GenericWidget 只是一個小部件;我認為這就是組合所做的,我創建的所有 GenericWidget 都放在一個 Box 中,該 Box 位于窗口中的 SetContent 框中。但該錯誤向我表明,不知何故,此 Select 對象設置不正確,當它繪制選項時,缺少某些內容。我做錯了什么?我的整個方法可能是錯誤的(我做了很多 C++ 和 Python 工作,并且我對事物采取面向對象的觀點)。在這種情況下,我該如何做這一切呢?
- 2 回答
- 0 關注
- 169 瀏覽
添加回答
舉報
0/150
提交
取消