如何在睡眠时忽略用户输入在Python 3?(How to ignore user input du

2019-10-18 10:29发布

我是新来的编程和我坚持这个问题在小RPG游戏我正在做。 它的主要依据是文本,但使用Tkinter的一个简单的GUI。

战斗中,我有一个for循环,通过参加在战斗中的所有生物进入,并通过一个按照每个动作的小睡执行他们的行动之一。 我的问题是,当用户按下按键或点击按钮时,命令被缓冲,并且所执行的for循环完成后。 有没有一种简单的方法,而这种循环会忽略用户的命令? 我试着解除绑定按键和禁用按钮,然后重新启用它们的循环完成时,但它仍然无法正常工作。 我也看到了有关冲洗用户输入,但我不能弄明白。 因为我是一个菜鸟,我想我在这里失去了一些基本的概念。

这里是我的代码:

def battle_round(self, command):
    ''' (Battle, command) -> NoneType
    A round of battle where every creature gets an action.
    '''
    # Pause player input with mode variable.

    self.player.mode = 'wait'

    # Keep track of number of rounds.
    self.round_number += 1

    # Get initiative order for all mobs, party members, and player.
    ordered_creatures = self.initiative()

    # Get commands from each mob.
    for mob in self.mobs:
        mob.command = self.determine_mob_command()

    # Check battle speed option.
    delay = 1

    # Begin actions for all creatures.
    for creature in ordered_creatures:
        # Delay between actions. Write a space between lines.
        self.text_window.update_idletasks()
        self.write(self.text_window, '\n')
        time.sleep(delay)
        # Player action.
        if type(creature) == Player:
            if command == 'standard_attack':
                self.standard_player_attack()
            if command == 'retreat':
                self.retreat()

        if type(creature) == PartyMember:
            pass

        # MOB action.  
        if type(creature) == MOB:
            if creature.command == 'standard_attack':
                self.standard_mob_attack(creature)

    self.start_next_round()

我使用Python 3.2.3 Tk的8.5和闲置3.2.3。 我的操作系统是Windows 7。

提前致谢!

编辑:感谢您的答复迄今家伙。 我可以在我的头上,因为在这里我甚至不知道是什么的线程是直到刚才,我不知道我怎么会去阅读,而忽略用户输入。 至于对用户输入的代码去,我有很多的吧。 我会复制和粘贴在这里的一些:

def attack():
    if player.in_battle == True:
        if player.mode != 'wait':
            player.current_battle.battle_round('standard_attack')

def retreat():
    if player.in_battle == True:
        if player.mode != 'wait':
            player.current_battle.battle_round('retreat')

# Set up battle buttons.
attack_button = Button(battle_button_frame, text='(A)ttack', command=attack,
                     width=10,)
attack_button.grid(column=1, columnspan=1, row=2, padx=5, pady=5)

retreat_button = Button(battle_button_frame, text='(R)etreat', command=retreat,
                     width=10,)
retreat_button.grid(column=2, columnspan=1, row=2, padx=5, pady=5)


battle_button_list = [attack_button, retreat_button]

这些按钮,例如是让用户无论是在进攻选择的怪兽,或尝试运行逃离战场。

我也有几个关键的绑定:

# Bind Keys
root.bind('<Escape>', func=keyboard_cancel)

root.bind('<Control-Key-m>', func=keyboard_move_mode)
root.bind('<Control-Key-M>', func=keyboard_move_mode)
root.bind('<Control-Key-l>', func=keyboard_look_mode)
root.bind('<Control-Key-L>', func=keyboard_look_mode)
root.bind('<Control-Key-t>', func=keyboard_talk_mode)
root.bind('<Control-Key-T>', func=keyboard_talk_mode)

root.bind('<space>', func=keyboard_begin_battle)

root.bind('<Left>', func=arrow_key_select_left)
root.bind('<Right>', func=arrow_key_select_right)

我的问题仍然是,当for循环与睡觉是怎么回事,如果用户按下一个按钮或使用键绑定,它会被尽快战斗回合结束执行。 (7秒左右,如果有6个怪物和玩家。)我在这一个完整的初学者,所以我不为我的岗位明确和我的代码是乌七八糟道歉。

文章来源: How to ignore user input during sleep in Python 3?