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
。