2016-08-02 11 views
1

Ich möchte eine Zeichenfolge von Buchstaben eins für jedes Mal, um Benutzer zu bitten, klicken, und das Spiel wird nur fortgesetzt, wenn Benutzer die richtige Taste drücken.Python tkinter Eingabeaufforderung

Ich habe Probleme mit der Taste drücken Teil. Ich möchte den Text auf der Schaltfläche abrufen und testen, ob er mit dem Eingabeaufforderungsbuchstaben übereinstimmt. Wenn er mit dem Eingabe-Widget übereinstimmt, wird der nächste Buchstabe angezeigt, andernfalls bleibt er einfach ruhig.

Ich importierte zufällig, um die Buchstaben zu mischen, damit es jedes Mal verschiedene Buchstaben erzeugt. Ich habe die random.shuffle(alist) nicht hinzugefügt, weil es nicht funktioniert.

hier ist mein Code:

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() 

Antwort

2

Sie können Ihr Problem durch binding das gleiche Ereignis für jede Taste, die Sie erstellt lösen.

Daher müssen Sie in Ihrem Callback die Schaltfläche, auf die geklickt wird (welche Sache Ihr tatsächlicher Code nicht tut) identifizieren, um den Text mit der Methode cget() mit dem Inhalt des Eingabe-Widgets zu vergleichen.

Beachten Sie, dass, um n innerhalb game() zu erhöhen, Sie es als instance variable rendern müssen. Sie müssen vorsichtig sein, es nicht zu erhöhen, wenn es den gleichen Wert wie die alist Länge erreicht.

Vollprogramm

Hier sind die oben genannten Ideen implementiert. Beachten Sie, dass ich mich darauf konzentriere, nur Ihre Probleme zu beheben. Das bedeutet, ich bin nicht die besten Praktiken kommentieren gehen sollten Sie wie folgt vor:

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() 

Demo

Hier ist ein Screenshot von der Lauf oben Programm:

enter image description here

+0

Hallo Billal, danke für die Probleme lösen. Ich muss auch die Tasten quadratisch aussehen lassen und ich habe versucht, die Höhe und Breite einzustellen, aber es funktioniert nicht. Könntest du mir dabei helfen? – chrisgjh

+0

Sie können (wie Sie es taten) 3 separate Frames erstellen und die Buttons usign 'grid()' anstelle von 'pack()' hinzufügen. Definieren Sie für jeden Frame seine Zeilen (eine Zeile pro Frame) und Spalten (gleich der Anzahl der 'j's in Ihrem Code), um das Gewicht gleich 1 zu haben. Stellen Sie natürlich die' width' und 'height' von jede Taste. Es muss funktionieren. –