如何在Julia中每次按键时读取键盘输入?

时间:2019-07-04 12:45:55

标签: input julia

我尝试过$.each(JSON.parse(data), function(key, value) {}

仅在按下Enter键后,它才会从键盘读取字符,但不会在每次按下/释放键时读取。

请在按键或释放键时指导我阅读键盘输入!

更新1:

c::Char = read(stdin, Char);

抛出错误:

function quit()
print("Press q to quit!");
opt = getc1();
    while true
       if opt = 'q'
            break;
        else
            continue;
        end
    end
end

请帮助我!

2 个答案:

答案 0 :(得分:3)

这不是那么简单。

您可以尝试以下更底层的解决方案:

function getc1()
    ret = ccall(:jl_tty_set_mode, Int32, (Ptr{Cvoid},Int32), stdin.handle, true)
    ret == 0 || error("unable to switch to raw mode")
    c = read(stdin, Char)
    ccall(:jl_tty_set_mode, Int32, (Ptr{Cvoid},Int32), stdin.handle, false)
    c
end

或更高级的一个:

function getc2()
    t = REPL.TerminalMenus.terminal
    REPL.TerminalMenus.enableRawMode(t) || error("unable to switch to raw mode")
    c = Char(REPL.TerminalMenus.readKey(t.in_stream))
    REPL.TerminalMenus.disableRawMode(t)
    c
end

根据您的需要(或使用此处的思想编写另一个实现)。关键的挑战是始终正确处理“普通键”(如ASCII)。但是,解决方案的不同之处在于它们处理诸如'ą'之类的字符(某些字符的UNICODE较大)或UP_ARROW(当您按键盘上的向上键时)的方式-您必须在这里进行实验并确定所需的内容(还是足以一一读取UInt8值并手动重建您想要的值?)。

编辑

问题出在您的quit函数上。这是应如何定义:

function quit()
    print("Press q to quit!");
    while true
        opt = getc1();
        if opt == 'q'
            break
        else
            continue
        end
    end
end

答案 1 :(得分:0)

以下示例可能会有所帮助:


import REPL

function wait_for_key( ;
    io_in::IO = stdin,
    io_out::IO = stdout,
    prompt::String = "press any key [d]raw [n]odraw [q]uit : ",
)

    print(io_out, prompt)

    t = REPL.TerminalMenus.terminal
    REPL.Terminals.raw!(t, true)
    char = read(io_in, Char) 
    REPL.Terminals.raw!(t, false)

    write(io_out, char)
    write(io_out, "\n")

    return char
end