Go TUI программирование с использованием TCell API - PullRequest
0 голосов
/ 18 февраля 2019

Я пытаюсь изучить программирование TUI в Go с использованием API TCell.Это простое приложение, которое печатает слово "привет".Однако, когда я запускаю программу ниже, ничего не происходит.Пожалуйста, скажите мне, что я делаю не так.

package main
import (
         "fmt"
         "github.com/gdamore/tcell"
         "os"
)

func main() {
        scn, err := tcell.NewScreen()
        if err != nil {
                 fmt.Fprintf(os.Stderr, "%v\n", err)
                 os.Exit(1)
         }
         hhh := []rune("hello")
         scn.SetContent(10, 10, rune(' '), hhh, tcell.StyleDefault)
         scn.Show()
}

1 Ответ

0 голосов
/ 22 февраля 2019

Создатель этого API (https://github.com/gdamore/tcell.git) предоставил решение. Вот его ответ:

Есть три потенциальных проблемы.

Во-первых, вам нужно инициализировать экранВызовите scn.Init () после создания экрана.

Во-вторых, ваш вызов SetContent ошибочен. Строка, которую вы передаете, предназначена для объединения символов. Вместо этого вам нужно вызвать SetContent 5 раз (одиндля каждой буквы «hello») с различным смещением и соответствующей буквой «hello». Возможно, вы захотите просто передать «» для 4-го аргумента (строки), поскольку ни один из них не объединяет символы ..

Третья проблема заключается в том, что ваша программа просто завершается. На большинстве терминалов это приведет к сбросу терминала, что приведет к потере выходных данных. (Например, на xterm tcell по умолчанию использует альтернативный экранный буфер, что приводит квыйти, вызывая потерю содержимого этого экрана, когда он возвращается к основному экранному буферу при завершении программы.Самый простой способ доказать это - добавить time.Sleep (time.Second * 10) или аналогичный последней строке вашей программы.

Вот модифицированный код:


import (
        "fmt"
        "github.com/gdamore/tcell"
        "github.com/gdamore/tcell/encoding"
        "os"
        "time"
)

func main() {
        encoding.Register()
        scn, err := tcell.NewScreen()
        scn.Init()
        if err != nil {
                fmt.Fprintf(os.Stderr, "%v\n", err)
                os.Exit(1)
        }
        scn.Clear()
        scn.SetContent(10, 10, rune('h'), []rune(""), tcell.StyleDefault)
        scn.Show()
        time.Sleep(time.Second * 2)
}

Надеюсь, что это поможет.

...