2016-09-28 93 views
2

下面是一些示例代码,在屏幕上放置一个Gauge并使进度条每秒增加1个值。在MacOS上,除非我用鼠标拖动窗口或手动调整窗口大小,否则不会看到进度栏更新。任何想法如何强制整个事情重画?我打电话f.Refresh()和f.Update()如何在MacOS上使用wxWidgets(使用golang)重绘窗口?

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 
} 

更新:我一直在阅读http://docs.wxwidgets.org/trunk/overview_thread.html,我想这样的代码:

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

,而不是调用刷新和更新但我的wx.NewPaintEvent不做任何事情。也许我正在使wx.NewPaintEvent错误?或者我将它添加到错误的EventHandler中?

+0

什么是OSX版本?什么是wx版本?你可以建立wx并尝试对话示例吗? – Igor

+0

10.11.6,来自github.com/dontpanic92/wxGo/wx的主人是wxWidgets-3.1.0,是的样本包括良好的构建,但没有任何线程喜欢我的例子 –

+0

你是否试图与计量器和窗口从辅助线程? – Igor

回答

0

作者固定它:

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) 

然后在螺纹:

threadEvent := wx.NewThreadEvent(wx.EVT_THREAD, UPLOAD_WORKER_ID) 
threadEvent.SetInt(50) 
f.QueueEvent(threadEvent) 
0

一般来说,wxWidgets不支持使用非主要(即不是初始化库)线程的GUI对象。

通常的解决方法是将事件发布到主线程,要求它更新小部件,而不是直接在工作线程中执行它。在C++中,这可以使用CallAfter()轻松而优雅地完成,但我对Go和Go wxGo不够了解,并且向您展示了使用该语言执行此操作的示例。 wxGo的

+0

谢谢,我一直在阅读http://docs.wxwidgets.org/trunk/overview_thread.html,但是我无法得到我添加到我的框架的wxEventHandler中去执行任何操作的wxPaintEvent。 –

+0

您不能直接生成'wxPaintEvent's,这是底层GUI本身的工作。你确实需要从主线程调用'Refresh()'。 –