从连接读取更新多行条目

时间:2018-05-23 13:39:13

标签: user-interface go

我得到了简单的桌面应用程序在Go上用这个lib写的:github.com/ProtonMail/ui。主窗口的图如下:

err := ui.Main(func() {
    window := ui.NewWindow("Chat", 500, 500, false)
    input := ui.NewEntry()
    send := ui.NewButton("Send")
    output := ui.NewMultilineNonWrappingEntry()
    output.SetReadOnly(true)
    mainBox := ui.NewHorizontalBox()
    usersBox := ui.NewVerticalBox()
    messageBox:=ui.NewVerticalBox()
    messageBox.Append(output, true)
    messageBox.Append(input, false)
    messageBox.Append(send, false)
    mainBox.Append(usersBox, false)
    mainBox.Append(messageBox, true)
    send.OnClicked(func(*ui.Button) {
        _, err := conn.Write([]byte(JSONencode(userExample1.Text(),input.Text(),"SendMessageTo")))
        if err!=nil{
            fmt.Println("OnClickedError!")
        }
        input.SetText("")
    })
    window.SetChild(mainBox)
    window.OnClosing(func(*ui.Window) bool {
        ui.Quit()
        return true
    })
    window.Show()

它正在从服务器连接读取并输出解码后的字符串。服务器发送如下所述:

func ParseJSON(bytes []byte, conn net.Conn) (Message, string, string) {
    flag := "tcp"
    message := Message{}
    err := json.Unmarshal(bytes, &message)
    if err != nil {
        log.Print("Unmarshal doesn't work: ")
        log.Fatal(err)
    }
    fmt.Println(message.User.Login)
    fmt.Println(message.Content)
    conn.Write([]byte(message.Content))
    return message, "func", flag
}

我如何以此参赛表格输出

output := ui.NewMultilineNonWrappingEntry()
output.SetReadOnly(true)

从服务器收到字符串?

更新:

go func() {
            message, err := bufio.NewReader(conn).ReadString('\n')
            if err!=nil{
                log.Fatal(err)
            }
            output.SetText(message)
        }()

此代码放在ui.Main函数中,但不起作用。

1 个答案:

答案 0 :(得分:1)

您可以尝试使用Append方法:

output := ui.NewMultilineNonWrappingEntry()

// Call this from your message receiving function:
output.Append("message")

另一个选择是使用SetText并在其他地方保留文本的缓冲区:

// Create a buffer:
buf := bytes.Buffer{}

// Write incoming messages to it:
buf.WriteString("message")

// Set the contents from the buffer
// This might be called periodically (and the buffer reseted):
output.SetText(buf.String())