2016-08-02 59 views
1

我想每次提示一个字母串,要求用户点击,只有当用户按下正确的键时,游戏才会继续。Python tkinter条目提示

我遇到了按键部分的问题。我想获取按钮上的文本,并测试它是否与提示的字母相匹配,如果匹配的条目小部件将提示下一个字母,否则它只是保持不动。

我随机导入随机混合字母,以便每次都会生成不同的字母。我没有添加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() 

回答

2

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

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

请注意,为了在game()内部增加n,您需要将其渲染为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() 

演示

下面是上面的程序运行的截图:

enter image description here

+0

嗨Billal,感谢解决问题。我还需要使键看起来平方,我试图设置高度和宽度,但它不起作用。你能帮我吗? – chrisgjh

+0

您可以创建3个独立的框架(如您所做的那样)并添加按钮usign'grid()'而不是'pack()'。对于每一帧,将其行(每帧一行)和列(等于代码中'j's的数量)配置为权重等于1.当然,设置“宽度”和“高度”为每个按钮。它必须工作。 –