使用Fyne在Golang应用程序内创建详细控制台

6jjcrrmo  于 2022-12-16  发布在  Go
关注(0)|答案(2)|浏览(454)

我来自Python和PyQt图形用户界面,我习惯于在我的程序中添加一种控制台,目的是向用户指示正在进行的进程、遇到的执行错误等信息。
在Python/PyQt中,我使用QLineEdit来完成这个任务,它非常容易使用,只需在我的GUI中创建并插入小部件,然后通过调用appen()为每个信息添加一行即可。
例如,控制台可以在加载esedb文件时说“esedb loading”,然后在完成时说“esedb file loaded”,然后说“esedb parsing”进行下一步,等等......
现在,我正在和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()
qrjkbowd

qrjkbowd1#

TextGrid是一个复杂的组件,用于在等宽排列(如终端等)中管理字符特定的字体样式。
为了提高性能,我建议在Scroll小部件中使用VBox,其中每行都是另一个附加标签(您也可以将它们设置为等宽文本样式)。如果您希望文本是交互式的,那么正如其他人所说的,NewMultiLineEntry很适合您。
文本是复杂的,我们正在努力优化更多的复杂用法和大文件处理,所以它会在以后的版本中变得更加流畅...

vfwfrxfs

vfwfrxfs2#

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()
}

相关问题