[GH-ISSUE #811] How to use textview as terminal print #592

Closed
opened 2026-03-04 01:06:18 +03:00 by kerem · 1 comment
Owner

Originally created by @zenithbb on GitHub (Feb 11, 2023).
Original GitHub issue: https://github.com/rivo/tview/issues/811

I have a function runs by some steps, I want each step print something in the terminal use textview, but problem is: before the func return, the text not show as expect.
below is the code, only third info is printed in the terminal
how can I print all info


import (
	"fmt"
	"time"

	"github.com/rivo/tview"
)

var ttext = tview.NewTextView()
var tinput = tview.NewForm()

var app = tview.NewApplication()

func InitInput() *tview.Form {
	tinput.AddButton("Change Text", func() { DoSomething() })
	tinput.SetBorder(true)
	return tinput
}

func DoSomething() error {
	ttext.SetText(fmt.Sprintf("first %v", time.Now().String()))
	time.Sleep(5 * time.Second)
	ttext.SetText(fmt.Sprintf("second %v", time.Now().String()))
	time.Sleep(time.Second)
	ttext.SetText(fmt.Sprintf("third %v", time.Now().String()))
	return nil
}

func main() {
	InitInput()
	ttext.SetRegions(true).SetDynamicColors(true).SetWordWrap(true).SetBorder(true).SetTitle("Changed Text")
	flex := tview.NewFlex().AddItem(tinput, 0, 1, true).AddItem(ttext, 0, 1, false)
	if err := app.SetRoot(flex, true).EnableMouse(true).SetFocus(flex).Run(); err != nil {
		panic(err)
	}
}
Originally created by @zenithbb on GitHub (Feb 11, 2023). Original GitHub issue: https://github.com/rivo/tview/issues/811 I have a function runs by some steps, I want each step print something in the terminal use textview, but problem is: before the func return, the text not show as expect. below is the code, only third info is printed in the terminal how can I print all info ```package main import ( "fmt" "time" "github.com/rivo/tview" ) var ttext = tview.NewTextView() var tinput = tview.NewForm() var app = tview.NewApplication() func InitInput() *tview.Form { tinput.AddButton("Change Text", func() { DoSomething() }) tinput.SetBorder(true) return tinput } func DoSomething() error { ttext.SetText(fmt.Sprintf("first %v", time.Now().String())) time.Sleep(5 * time.Second) ttext.SetText(fmt.Sprintf("second %v", time.Now().String())) time.Sleep(time.Second) ttext.SetText(fmt.Sprintf("third %v", time.Now().String())) return nil } func main() { InitInput() ttext.SetRegions(true).SetDynamicColors(true).SetWordWrap(true).SetBorder(true).SetTitle("Changed Text") flex := tview.NewFlex().AddItem(tinput, 0, 1, true).AddItem(ttext, 0, 1, false) if err := app.SetRoot(flex, true).EnableMouse(true).SetFocus(flex).Run(); err != nil { panic(err) } }
kerem closed this issue 2026-03-04 01:06:18 +03:00
Author
Owner

@rivo commented on GitHub (Mar 25, 2023):

SetText() doesn't cause the text view to be redrawn. It is only redrawn after DoSomething() returns, which happens after 6 seconds.

It's generally not a good idea to block everything. So here's an non-blocking example which queues the update to the text view in the intervals used in your code:

package main

import (
	"fmt"
	"time"

	"github.com/rivo/tview"
)

var ttext = tview.NewTextView()
var tinput = tview.NewForm()

var app = tview.NewApplication()

func InitInput() *tview.Form {
	tinput.AddButton("Change Text", func() { go DoSomething() })
	tinput.SetBorder(true)
	return tinput
}

func DoSomething() error {
	app.QueueUpdateDraw(func() { ttext.SetText(fmt.Sprintf("first %v", time.Now().String())) })
	time.Sleep(5 * time.Second)
	app.QueueUpdateDraw(func() { ttext.SetText(fmt.Sprintf("second %v", time.Now().String())) })
	time.Sleep(time.Second)
	app.QueueUpdateDraw(func() { ttext.SetText(fmt.Sprintf("third %v", time.Now().String())) })
	return nil
}

func main() {
	InitInput()
	ttext.SetRegions(true).SetDynamicColors(true).SetWordWrap(true).SetBorder(true).SetTitle("Changed Text")
	flex := tview.NewFlex().AddItem(tinput, 0, 1, true).AddItem(ttext, 0, 1, false)
	if err := app.SetRoot(flex, true).EnableMouse(true).SetFocus(flex).Run(); err != nil {
		panic(err)
	}
}
<!-- gh-comment-id:1483903136 --> @rivo commented on GitHub (Mar 25, 2023): `SetText()` doesn't cause the text view to be redrawn. It is only redrawn after `DoSomething()` returns, which happens after 6 seconds. It's generally not a good idea to block everything. So here's an non-blocking example which queues the update to the text view in the intervals used in your code: ```go package main import ( "fmt" "time" "github.com/rivo/tview" ) var ttext = tview.NewTextView() var tinput = tview.NewForm() var app = tview.NewApplication() func InitInput() *tview.Form { tinput.AddButton("Change Text", func() { go DoSomething() }) tinput.SetBorder(true) return tinput } func DoSomething() error { app.QueueUpdateDraw(func() { ttext.SetText(fmt.Sprintf("first %v", time.Now().String())) }) time.Sleep(5 * time.Second) app.QueueUpdateDraw(func() { ttext.SetText(fmt.Sprintf("second %v", time.Now().String())) }) time.Sleep(time.Second) app.QueueUpdateDraw(func() { ttext.SetText(fmt.Sprintf("third %v", time.Now().String())) }) return nil } func main() { InitInput() ttext.SetRegions(true).SetDynamicColors(true).SetWordWrap(true).SetBorder(true).SetTitle("Changed Text") flex := tview.NewFlex().AddItem(tinput, 0, 1, true).AddItem(ttext, 0, 1, false) if err := app.SetRoot(flex, true).EnableMouse(true).SetFocus(flex).Run(); err != nil { panic(err) } } ```
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
starred/tview#592
No description provided.