来自Python和PyQt gui,我习惯于在我的程序中添加一种控制台。目的是向用户指示正在进行的进程、遇到的执行错误等信息。
在Python/PyQt中,我使用QLineEdit来做到这一点。它很容易使用。只需在我的gui中创建并插入小部件,并通过调用appen()为每个信息添加一行。
例如,控制台可以说"esedb loading"加载esedb文件时,则"esedb file loaded";完成后,再进行"esedb解析"。对于下一步,等等…
现在,我正在和Fyne一起学习Golang,我正在寻找一种类似的方法。
我找到了widget.NewTextGrid(),但它不像我期望的那样工作。我不能只是附加新行。如果我没理解错的话,我必须将文本存储在字符串变量
中你能告诉我怎么做吗?
谢谢!
package main
import (
//"fmt"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/canvas"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/layout"
"fyne.io/fyne/v2/theme"
"fyne.io/fyne/v2/widget"
)
func main() {
myapp := app.New()
myappGui := myapp.NewWindow("Example")
myappGui.Resize(fyne.NewSize(400, 600))
textConsole := widget.NewTextGrid()
TextGrid是一个复杂的组件,设计用于管理字符特定的字体样式在等宽排列(如终端等)。
对于性能,我建议在滚动小部件中使用VBox,其中每行都是另一个附加标签(您也可以将它们设置为等宽文本样式)。如果您希望文本是交互式的,那么正如其他答案所说,NewMultiLineEntry很可能适合您。
文本是复杂的,我们正在努力优化更多复杂的用法和大文件处理,所以它会在以后的版本中变得更流畅…
widget.TextGrid
没有附加一行的方法,但它支持使用TextGrid.Text()
查询其当前内容。所以你可以设置一个新的文本,它是当前的内容和新的行连接,例如:
textConsole.SetText(textConsole.Text() + "n" + line)
但是要知道widget.TextGrid
不支持滚动:它的大小将由它的字符串内容决定。当然,您可以使用container.Scroll
使其可滚动。
例如:
func main() {
myapp := app.New()
w := myapp.NewWindow("Example")
w.Resize(fyne.NewSize(500, 300))
textConsole := widget.NewTextGrid()
scrollPane := container.NewScroll(textConsole)
w.SetContent(scrollPane)
go func() {
for {
textConsole.SetText(textConsole.Text() + time.Now().String() + "n")
scrollPane.ScrollToBottom()
time.Sleep(time.Second)
}
}()
w.ShowAndRun()
}
也可以使用多行widget.Entry
。它还支持选择它的任何部分,默认情况下它也是可编辑的。当然,您可以禁用编辑。默认支持滚动。
请看下面的例子:
func main() {
myapp := app.New()
w := myapp.NewWindow("Example")
w.Resize(fyne.NewSize(500, 300))
textConsole := widget.NewMultiLineEntry()
textConsole.Disable() // Disable editing
w.SetContent(textConsole)
go func() {
for {
textConsole.SetText(textConsole.Text + time.Now().String() + "n")
time.Sleep(time.Second)
}
}()
w.ShowAndRun()
}