Python 如何知道何时键入某个字符序列?

Python 如何知道何时键入某个字符序列?,python,tkinter,key-bindings,Python,Tkinter,Key Bindings,我正在写一个类似愤怒的小鸟的游戏,我希望当玩家输入‘g’,然后输入‘o’,然后输入‘d’(‘上帝’,代表‘上帝模式’),一个目标将出现在小鸟当前(给定度和初始速度)降落的地方(如果你开火的话)。-上帝模式在游戏中可用3次 所以我尝试了类,并存储最后键入的两个字符: [我使用tkinter和Image,PIL中的ImageTk] class GodMode: times_left = 3 # Default def __init__(self, master, image_file):

我正在写一个类似愤怒的小鸟的游戏,我希望当玩家输入‘g’,然后输入‘o’,然后输入‘d’(‘上帝’,代表‘上帝模式’),一个目标将出现在小鸟当前(给定度和初始速度)降落的地方(如果你开火的话)。-上帝模式在游戏中可用3次

所以我尝试了类,并存储最后键入的两个字符: [我使用tkinter和Image,PIL中的ImageTk]

class GodMode:

times_left = 3   # Default

def __init__(self, master, image_file):
    self.master = master
    self.target_image = Image.open(image_file) 
    self.target = ImageTk.PhotoImage(self.target_image.resize((RED_CROSS_WIDTH, RED_CROSS_HEIGHT), Image.ANTIALIAS))

def display(self, bird):
    self.times_left -= 1
    self.x = physics.distance_traveled(bird)
    self.y = TARGET_Y_LOCATION
    self.master.create_image(self.x, self.y, image = self.target)

def typing_god(self, keystroke, bird):
    '''This function is first called when "g" is typed, from another 
    function (who is binded in the "main" function)
    '''
    if keystroke is None:
        self.last_char = "g"
    else:
        if keystroke.char == "d" or keystroke.char == "D":
            if self.last_char == "o" and self.char_before_last == "g":
                if self.times_left == 3:
                    self.god_mode_start(bird)
                elif 0 < self.times_left:
                    self.god_mode_alert(bird)
                else:
                    help_over()
                    return
        else:
            self.char_before_last = self.last_char
            self.last_char = keystroke.char
    self.master.bind('<Key>', lambda event: typing_god(event, bird))

def god_mode_start(self):
    start_input = messagebox.askyesno(title = "GOD Mode", message = "The god mode is only optional 3 times. Are you sure?")
    if not start_input:
        return
    self.display(bird)

def god_mode_alert(self, bird):
    start = messagebox.showinfinfo(title = "GOD Mode", message = GOD_MODE_FORMAT % self.gode_mode_left)
    if not start:
        return
    self.display(bird)

@staticmethod
def help_over():
    messagebox.showinfo(title = "GOD Mode not available", message = "You have used all your help.")
class模式:
倍左=3#默认值
def_uuuinit_uuu(自、主、映像文件):
self.master=master
self.target\u image=image.open(image\u文件)
self.target=ImageTk.PhotoImage(self.target\u image.resize((红十字宽度、红十字高度)、image.antialas))
def显示(自身、鸟形):
self.times_left-=1
self.x=物理距离(鸟)
self.y=目标位置
self.master.create_映像(self.x,self.y,image=self.target)
def键入_god(自我、击键、鸟):
''当从另一个输入“g”时,首先调用此函数
函数(谁绑定在“主”函数中)
'''
如果击键为“无”:
self.last_char=“g”
其他:
如果keystroke.char==“d”或keystroke.char==“d”:
如果self.last_char==“o”和self.char_在self.last==“g”之前:
如果self.times_left==3:
self.good\u模式\u启动(bird)
elif 0
…但那没用,我不知道为什么

非常感谢你的帮助

大卫

我会用a来表示。您可以设置
maxlen=3
。当你得到一个新的击键时,你可以附加到它。检查
deque
中是否有
god
,也很容易:

In [1]: from collections import deque
In [2]: d = deque(maxlen=3)
In [3]: d.append('g') # new keystroke
In [4]: d.append('o') # new keystroke
In [5]: d.append('d') # new keystroke
In [6]: d
Out[6]: deque(['g', 'o', 'd'], maxlen=3)
In [7]: ''.join(d) == 'god'  # check if we already in the god mode
Out[7]: True
In [8]: d.append('x') # new keystroke
In [9]: d
Out[9]: deque(['o', 'd', 'x'], maxlen=3)
In [10]: ''.join(d) == 'god' # check if we already in the god mode
Out[10]: False

它看起来像是
self.master.bind(“”,lambda event:typing_god(event,bird))
可能永远不会被调用,您是否在该语句周围添加了一个打印项以进行检查

您可能希望将其放在构造函数中,并使用
self。键入\u god

def __init__(self, master, image_file):
    self.master = master
    self.target_image = Image.open(image_file) 
    self.target = ImageTk.PhotoImage(self.target_image.resize((RED_CROSS_WIDTH, RED_CROSS_HEIGHT), Image.ANTIALIAS))
    # Add a debug statement to check that this method is getting called
    print "Binding key events to self.typing_god"
    # Bind the key down event in the constructor
    self.master.bind('<Key>', lambda event: self.typing_god(event, bird))
def\uuuuu init\uuuuuuuuuuuuuuuuuuuuu(自、主、图像文件):
self.master=master
self.target\u image=image.open(image\u文件)
self.target=ImageTk.PhotoImage(self.target\u image.resize((红十字宽度、红十字高度)、image.antialas))
#添加调试语句以检查是否正在调用此方法
打印“将密钥事件绑定到self.typing\u god”
#在构造函数中绑定键关闭事件
self.master.bind(“”,lambda事件:self.typing_god(事件,bird))

执行绑定时,可以将事件串在一起。例如,您可以绑定三个字符的序列“god”(例如:


但是错误到底是什么呢?没有错误,它根本不起作用。如果你发射了一个目标,它不会出现在鸟可能降落的地方。
self.master.bind(“”,lambda事件:键入上帝(事件,鸟))
看起来可疑-你是否试图从
GodMode
类中调用
键入上帝
?如果是这样的话,那么你应该把它改成self。输入上帝你是对的。我更改了它,但它仍然不起作用。为了获得额外的挑战,请编写一个同样适用于作弊代码“xyzy”和“idspispod”的解决方案,并且不使用名为
char\u before\u char\u before\u char\u before\u char\u before\u char\u char\u before\u char\u before\u char\u char\u before\u char\u before\u char\u char\u before\u\u char\u before\u last\u的。
def god_mode(event):
    print("god mode is activated")
some_widget.bind("<g><o><d>", god_mode)
some_widget.event_add("<<GodMode>>", "<g><o><d>")
some_widget.bind("<<GodMode>>", god_mode)