Input 如何在julia中每次击键时读取键盘输入?

Input 如何在julia中每次击键时读取键盘输入?,input,julia,Input,Julia,我尝试了,c::Char=read(stdin,Char) 它仅在按下enter键后从键盘读取字符,而不是每次按下/释放键盘时读取字符 请指导我在按键或释放时阅读键盘输入 更新1: function quit() print("Press q to quit!"); opt = getc1(); while true if opt = 'q' break; else continue; end

我尝试了,
c::Char=read(stdin,Char)

它仅在按下enter键后从键盘读取字符,而不是每次按下/释放键盘时读取字符

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

更新1:

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

TypeError:non-boolean(Int64) used in boolean context.

请帮帮我

这并不是那么简单

您可以尝试以下更低级的解决方案:

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字符)或向上箭头(当您按下键盘上的向上箭头键时)-您必须在这里进行试验并决定您想要什么(或者,您可以一个接一个地读取
UInt8
值,然后手动重建所需内容?)

编辑

问题在于您的
quit
函数。以下是它的定义:

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

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


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

问题在于您的
quit
函数。我已更新了答案,以说明如何使用
getc1