我想每次都提示输入一个字母字符串来要求用户单击,并且只有在用户按下正确的键时游戏才会继续。

我在按键部分遇到了麻烦。我想在按钮上获取文本,并测试它是否与提示字母匹配,如果匹配,则输入小部件将提示下一个字母,否则它将保持静止。

我导入random来随机排列字母,以便每次生成不同的字母。我没有添加random.shuffle(alist),因为它不起作用。

这是我的代码:

from tkinter import *
from tkinter.ttk import *
import random
import tkinter

class KeyboardGame:
    def __init__(self):
        window = Tk()
        window.title('haha')
        self.value = StringVar()
        self.value.set('click on any key to start...')
        btm_frame = Frame(window, relief=RAISED)
        entry = Entry(window, text=self.value)
        entry.grid(row=0, column=0, padx=40, pady=5, sticky='EW')
        for i in ['ixnsywfhze', 'uobpqgtav', 'lmjkcdr']:
            frame1 = Frame(btm_frame)
            for j in i:
                button = Button(frame1, text=j, command=self.game)
                button.pack(side=LEFT)
                frame1.pack(padx=2, pady=2)

        btm_frame.grid(row=1, column=0, padx=5, pady=5)
        window.mainloop()



    def game(self):
        n = 0
        alist = ['h', 'c', 'p', 'e', 'm', 'n', 'd']

        self.value.set(alist[n])
        while button['text'] != alist[n]:
            self.value.set(alist[n])
        n += 1



KeyboardGame()

最佳答案

您可以通过对创建的每个按钮binding相同的事件来解决问题。

因此,在回调中,您将需要标识被单击的按钮(您的实际代码不执行此操作),以便使用cget()方法将其文本与条目小部件的内容进行比较。

请注意,为了在n中增加game(),您需要将其呈现为instance variable。当它达到与alist长度相同的值时,必须小心不要增加它。

完整程序

这是上述实现的想法。请注意,我只专注于解决您的问题。这意味着我不会评论您应该遵循的最佳实践:

from tkinter import *
from tkinter.ttk import *
import tkinter

class KeyboardGame:

   def __init__(self):
       window = Tk()
       window.title('haha')
       self.value = StringVar()
       self.value.set('h')
       self.btm_frame = Frame(window, relief=RAISED)
       self.entry = Entry(window, text=self.value)
       self.entry.grid(row=0, column=0, padx=40, pady=5, sticky='EW')
       self.n = 0

       for i in ['ixnsywfhze', 'uobpqgtav', 'lmjkcdr']:
           self.frame1 = Frame(self.btm_frame)
           for j in i:
               button = Button(self.frame1, text=j)
               button.pack(side=LEFT)
               button.bind("<Button-1>", self.game)
               self.frame1.pack(padx=2, pady=2)

       self.btm_frame.grid(row=1, column=0, padx=5, pady=5)
       window.mainloop()



   def game(self, event):
       alist = ['h', 'c', 'p', 'e', 'm', 'n', 'd']
       w = event.widget # Identify the button
       if w.cget("text") == self.value.get() and self.n < 6:
           self.n = self.n + 1
           self.value.set(alist[self.n])

# Start program
if __name__ =="__main__":
   KeyboardGame()


演示版

这是上面运行的程序的屏幕截图:

python - Python Tkinter输入提示-LMLPHP

关于python - Python Tkinter输入提示,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38716453/

10-15 02:04