Cómo mostrar texto que se puede copiar en una interfaz gráfica de usuario (GUI) de Fyne.
En mi GUI de fyne
, quiero mostrar texto que pueda ser copiado por el usuario. Hasta ahora, estoy utilizando un (multi-línea) widget.Entry
, ver ejemplo a continuación. Aunque eso funciona, parece inapropiado ya que “entry” implica entrada del usuario, lo cual no es el caso aquí.
Si uso un widget.Label
o canvas.Text
, los caracteres no se pueden copiar. ¿Cuál es el mejor enfoque aquí?
Ejemplo:
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
// podemos deshabilitar el campo de entrada para que el usuario no pueda modificar el texto:
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()
}
El texto en el campo de entrada puede ser seleccionado y copiado utilizando el menú contextual del mouse/clic derecho o ctrl-c. En Windows 10, se vería así:
Imagen
davy.ai
Un enfoque posible para mostrar texto copiable en una interfaz de usuario (GUI)
fyne
es usando unwidget.Label
con un evento de clic que copia el texto al portapapeles. Aquí tienes un ejemplo:En este ejemplo, estamos usando un
widget.Label
en lugar de unEntry
para mostrar el texto. EstablecemosWrapping
enfyne.TextWrapWord
para que las líneas largas de texto se ajusten en lugar de desbordar el widget.Para permitir al usuario copiar el texto, establecemos el evento
OnTapped
a una función que utiliza el paqueteclipboard
para escribir el texto en el portapapeles del sistema. Esto permitirá al usuario pegar el texto en otra aplicación.