如何显示可以在 fyne GUI 上复制的文本?
How to display text that can be copied on a fyne GUI?
在我的 fyne
GUI 上,我想显示用户可以复制的文本。到目前为止,我使用的是(多行)widget.Entry
,请参见下面的示例。虽然这行得通,但似乎不合适,因为“输入”意味着用户-输入——这里不是这种情况。
如果我使用widget.Label或canvas.Text,字符将无法复制。那么最好的方法是什么?
示例:
package main
import (
"time"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/data/binding"
"fyne.io/fyne/v2/widget"
)
func main() {
myApp := app.New()
myWindow := myApp.NewWindow("demo")
txtBound := binding.NewString()
txtWid := widget.NewEntryWithData(txtBound)
txtWid.MultiLine = true
// we can disable the Entry field so the user can't modify the text:
txtWid.Disabled()
go func() {
for {
txtBound.Set(time.Now().Format("2006-01-02\n15:04:05\nMST -0700"))
time.Sleep(time.Second)
}
}()
content := container.NewBorder(nil, nil, nil, nil, txtWid)
myWindow.SetContent(content)
myWindow.Resize(fyne.NewSize(500, 300))
myWindow.ShowAndRun()
}
可以选择输入字段中的文本,然后使用 mouse/right-click 上下文菜单或 ctrl-c 进行复制。在 Windows 10,看起来像
标签仅用于显示,它们不提供用户交互 - 这是基于网络的应用程序让我们感到困惑的东西:)。
在 Fyne 应用程序中,我们的目标是让所有用户交互都得到提示,按钮和链接是交互的,文本不是。
有两种可能的方法:
- 在您的标签旁边放置一个“复制”按钮,这已成为许多应用程序(例如密码管理器或 YouTube)中的常见做法
- 使用禁用的条目,以便可以与文本进行交互但不能对其进行编辑。
为了补充 andy.xyz 的回答,下面是一个示例,说明如何使用按钮将特定内容复制到剪贴板。 Fyne windows 有一个提供必要接口的 Clipboard 类型,例如
import (
"time"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/data/binding"
"fyne.io/fyne/v2/layout"
"fyne.io/fyne/v2/theme"
"fyne.io/fyne/v2/widget"
)
func main() {
myApp := app.New()
myWindow := myApp.NewWindow("demo")
txtBound := binding.NewString()
txtWid := widget.NewLabelWithData(txtBound)
bottomBox := container.NewHBox(
layout.NewSpacer(),
widget.NewButtonWithIcon("copy content", theme.ContentCopyIcon(), func() {
if content, err := txtBound.Get(); err == nil {
myWindow.Clipboard().SetContent(content)
}
}),
)
content := container.NewBorder(nil, bottomBox, nil, nil, txtWid)
go func() { // make changing content...
for {
txtBound.Set(time.Now().Format("2006-01-02\n15:04:05\nMST -0700"))
time.Sleep(time.Second)
}
}()
myWindow.SetContent(content)
myWindow.Resize(fyne.NewSize(500, 300))
myWindow.ShowAndRun()
}
在 Windows 10,看起来像
在我的 fyne
GUI 上,我想显示用户可以复制的文本。到目前为止,我使用的是(多行)widget.Entry
,请参见下面的示例。虽然这行得通,但似乎不合适,因为“输入”意味着用户-输入——这里不是这种情况。
如果我使用widget.Label或canvas.Text,字符将无法复制。那么最好的方法是什么?
示例:
package main
import (
"time"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/data/binding"
"fyne.io/fyne/v2/widget"
)
func main() {
myApp := app.New()
myWindow := myApp.NewWindow("demo")
txtBound := binding.NewString()
txtWid := widget.NewEntryWithData(txtBound)
txtWid.MultiLine = true
// we can disable the Entry field so the user can't modify the text:
txtWid.Disabled()
go func() {
for {
txtBound.Set(time.Now().Format("2006-01-02\n15:04:05\nMST -0700"))
time.Sleep(time.Second)
}
}()
content := container.NewBorder(nil, nil, nil, nil, txtWid)
myWindow.SetContent(content)
myWindow.Resize(fyne.NewSize(500, 300))
myWindow.ShowAndRun()
}
可以选择输入字段中的文本,然后使用 mouse/right-click 上下文菜单或 ctrl-c 进行复制。在 Windows 10,看起来像
标签仅用于显示,它们不提供用户交互 - 这是基于网络的应用程序让我们感到困惑的东西:)。 在 Fyne 应用程序中,我们的目标是让所有用户交互都得到提示,按钮和链接是交互的,文本不是。 有两种可能的方法:
- 在您的标签旁边放置一个“复制”按钮,这已成为许多应用程序(例如密码管理器或 YouTube)中的常见做法
- 使用禁用的条目,以便可以与文本进行交互但不能对其进行编辑。
为了补充 andy.xyz 的回答,下面是一个示例,说明如何使用按钮将特定内容复制到剪贴板。 Fyne windows 有一个提供必要接口的 Clipboard 类型,例如
import (
"time"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/data/binding"
"fyne.io/fyne/v2/layout"
"fyne.io/fyne/v2/theme"
"fyne.io/fyne/v2/widget"
)
func main() {
myApp := app.New()
myWindow := myApp.NewWindow("demo")
txtBound := binding.NewString()
txtWid := widget.NewLabelWithData(txtBound)
bottomBox := container.NewHBox(
layout.NewSpacer(),
widget.NewButtonWithIcon("copy content", theme.ContentCopyIcon(), func() {
if content, err := txtBound.Get(); err == nil {
myWindow.Clipboard().SetContent(content)
}
}),
)
content := container.NewBorder(nil, bottomBox, nil, nil, txtWid)
go func() { // make changing content...
for {
txtBound.Set(time.Now().Format("2006-01-02\n15:04:05\nMST -0700"))
time.Sleep(time.Second)
}
}()
myWindow.SetContent(content)
myWindow.Resize(fyne.NewSize(500, 300))
myWindow.ShowAndRun()
}
在 Windows 10,看起来像