我正在制作一个聊天程序,但遇到一个问题:屏幕仅在输入后更新。我正在使用turtle来显示聊天(我知道,turtle对于这个目的来说并不是那么好,但它非常简单。)
这是我循环中的代码:
while True:
ind = userlist.index(user)
if statlist[ind] == 'banned':
print('You have been banned.')
break
word = input('>>> ')
command(word)
if word != '':
chat = user + '(' + status + '): ' + word
update_room(chat)
refresh()
这里几乎所有东西都可以忽略,除了
word = input('>>> ')
和
refresh()
refresh()
是更新海龟室的东西。
我怎样才能让它打印出新的聊天记录,即使用户正在打字? 2 个并排的 while 循环可以工作吗?
我承认我的程序组织得不是很好,为了解决这个问题,我可能必须重写这个循环。 注意:我不想导入任何东西,但如果需要导入,那么如果该模块预装了 python,那就太好了。
或者另一个问题:是否可以有 2 个无限 while 循环同时并行运行?
所以我对Python还很陌生,但我有一个非常重复的想法。您需要首先删除输入部分并创建大量这样的函数:
def key_a:
global key_in
key_in = key_in + 'a'
def key_b:
global key_in
key_in = key_in + 'b'
def key_c:
global key_in
key_in = key_in + 'c'
这样,如果您输入的是 Enter,那么它会将其设置为单词并重置输入变量。
def key_enter:
global key_in
global word
word = key_in
key_in = ''
然后绑定您的输入(将“win”视为您的窗口变量。)
win.listen()
win.onkeypress(key_a, 'a')
对大写字母也执行相同的操作。
win.onkeypress(caps_key_a, 'A')
请告诉我这是否有帮助。
这是对 TaCo 的答案的改进,建议
onkeypress
可以实现实时键入的用户输入,这样即使用户按住按键也可以重新渲染。
我的贡献是使用一个调用通用函数的循环,因此无需为每个键手动创建单独的函数。我还提供了一个最小的、可运行的示例,它应该可以轻松适应聊天界面、打字游戏或其他环境。
我没有尝试处理每个键和边缘情况,因此您可能需要深入研究 Tk 键列表 并确保它满足您的需求。如果您遇到任何奇怪的行为,请随时提出改进建议。
from turtle import Screen, Turtle
from datetime import datetime
def tick():
current_time = datetime.now().strftime("%H:%M:%S")
turtle.clear()
turtle.goto(0, 50)
turtle.write(current_time, align="center", font=font)
turtle.goto(0, -50)
turtle.write(f"'{text}'", align="center", font=font)
screen.update()
screen.ontimer(tick, 1000 // 30)
def handle_keypress(key):
global text
text += key
def handle_backspace():
global text
text = text[:-1]
def add_key_handler(key):
screen.onkeypress(lambda: handle_keypress(key), key)
font = "Courier New", 18, "normal"
text = ""
screen = Screen()
screen.tracer(0)
turtle = Turtle()
turtle.penup()
turtle.hideturtle()
# lowercase
for i in range(97, 122):
add_key_handler(chr(i))
# caps
for i in range(65, 80):
add_key_handler(chr(i))
screen.onkeypress(handle_backspace, "BackSpace")
screen.onkeypress(lambda: handle_keypress(" "), "space")
screen.onkeypress(lambda: handle_keypress("-"), "minus")
screen.listen()
tick()
screen.exitonclick()