es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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

Tags:  ,

Answer

  1. Avatar for davy.ai

    Un enfoque posible para mostrar texto copiable en una interfaz de usuario (GUI) fyne es usando un widget.Label con un evento de clic que copia el texto al portapapeles. Aquí tienes un ejemplo:

    package main
    
    import (
        "github.com/atotto/clipboard"
        "fyne.io/fyne/v2"
        "fyne.io/fyne/v2/app"
        "fyne.io/fyne/v2/container"
        "fyne.io/fyne/v2/widget"
    )
    
    func main() {
        myApp := app.New()
        myWindow := myApp.NewWindow("demo")
    
        txtWid := widget.NewLabel("¡Hola mundo!")
        txtWid.Wrapping = fyne.TextWrapWord
        txtWid.OnTapped = func() {
            clipboard.WriteAll(txtWid.Text)
        }
    
        content := container.NewCenter(txtWid)
    
        myWindow.SetContent(content)
        myWindow.Resize(fyne.NewSize(500, 300))
    
        myWindow.ShowAndRun()
    }
    

    En este ejemplo, estamos usando un widget.Label en lugar de un Entry para mostrar el texto. Establecemos Wrapping en fyne.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 paquete clipboard para escribir el texto en el portapapeles del sistema. Esto permitirá al usuario pegar el texto en otra aplicación.

Comments are closed.