在等待输入python时更新turtle/gui

问题描述 投票:0回答:2

我正在制作一个聊天程序,但遇到一个问题:屏幕仅在输入后更新。我正在使用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 turtle-graphics python-turtle
2个回答
0
投票

所以我对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')

请告诉我这是否有帮助。


0
投票

这是对 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()

参考:是否有turtle-graphics使用的关键事件名称的完整列表?

© www.soinside.com 2019 - 2024. All rights reserved.