dsfw2154
dsfw2154
2016-09-28 16:59
浏览 199
已采纳

如何在MacOS上制作wxWidgets(使用golang)重绘窗口?

Here's some sample code that puts a Gauge on the screen and make the progress bar increase 1 value every second. On MacOS I don't see the progress bar update unless I drag the window around or resize it manually with the mouse. Any idea how to force the whole thing to repaint? I'm calling f.Refresh() and f.Update()

package main

import "github.com/dontpanic92/wxGo/wx"
import "time"

var g wx.Gauge

type MyFrame struct {
    wx.Frame
}

func (f *MyFrame) startUpload() {
    for {
        time.Sleep(time.Second)
        g.SetValue(g.GetValue() + 1)
        f.Refresh()
        f.Update()
    }
}

func NewMyFrame() MyFrame {
    f := MyFrame{}
    f.Frame = wx.NewFrame(wx.NullWindow, -1, "Test Thread")
    mainSizer := wx.NewBoxSizer(wx.HORIZONTAL)
    g = wx.NewGauge(f, wx.ID_ANY, 100, wx.DefaultPosition, wx.NewSize(600, 40), 0)
    f.SetSizer(mainSizer)
    mainSizer.Add(g, 100, wx.ALL|wx.EXPAND, 50)
    f.Layout()
    go f.startUpload()
    return f
}

func main() {
    wx1 := wx.NewApp()
    f := NewMyFrame()
    f.Show()
    wx1.MainLoop()
    return
}

Update: I've been reading http://docs.wxwidgets.org/trunk/overview_thread.html and I'm trying code like:

b := wx.NewPaintEvent()
f.GetEventHandler().QueueEvent(b)

instead of calling Refresh and Update but my wx.NewPaintEvent doesn't do anything. Maybe I'm making the wx.NewPaintEvent wrong? Or I'm adding it to the wrong EventHandler?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • dsx666666
    dsx666666 2016-09-30 18:44
    已采纳

    author of wxGo fixed it:

    https://github.com/dontpanic92/wxGo/issues/10

      wx.Bind(f, wx.EVT_THREAD, func(e wx.Event) {
        threadEvent := wx.ToThreadEvent(e)
        the_gauge.SetValue(threadEvent.GetInt())
      }, UPLOAD_WORKER_ID)
    

    then in the thread:

    threadEvent := wx.NewThreadEvent(wx.EVT_THREAD, UPLOAD_WORKER_ID)
    threadEvent.SetInt(50)
    f.QueueEvent(threadEvent)
    
    点赞 评论
  • duancai7002
    duancai7002 2016-09-29 14:57

    Generally speaking, doing anything with GUI objects from the non-main (i.e. not the one that initialized the library) thread is not supported by wxWidgets.

    The usual workaround is to post an event to the main thread asking it to update the widget instead of doing it directly in the worker thread. In C++ this can be done easily and elegantly using CallAfter(), but I don't know enough about Go and wxGo to show you an example of doing it in this language.

    点赞 评论

相关推荐