2016-05-18 10 views
2

Ich arbeite an einem GUI Python-Programm mit Tkinter.TkInter Entry Box ist deaktiviert

Ich habe eine Funktion, die aufgerufen wird, wenn eine Taste gedrückt wird (und wenn das Programm geladen wird). Das Programm ist derzeit nicht abgeschlossen und überprüft nur die Datenvalidierung an diesem aktuellen Punkt. Da der Standardeintrag aktuell ungültig ist, wird ein Fehler ausgegeben.

Aber nach diesem Punkt ist das Eingabefeld deaktiviert und lässt mich keine Daten eingeben. Ich kann mir nicht vorstellen, warum das passiert und ich frage mich, ob mir jemand den Grund sagen könnte, damit ich an einer Lösung arbeiten kann.

Dank

import sys 
import random 
from tkinter import * 
from tkinter import ttk 
from tkinter import messagebox 

root = Tk() 
root.title("COSC110 - Guessing Game") 
hint = StringVar() 
guesses = [] 
guess_input = '' 

def loadWordList(filename): #Load the words from a file into a list given a filename. 
    file = open(filename, 'r') 
    line = file.read().lower() 
    wordlist = line.split() 

    return wordlist 

word = random.choice(loadWordList('words.txt')) 

def getHint(word, guesses): #Get hint function, calculates and returns the current hint. 
    hint = ' ' 
    for letter in word: 
     if letter not in guesses: 
      hint += '_ ' 
     else: 
      hint += letter 

    return hint 

def guessButton(guess, word, guesses): 
    guess = str(guess_input) 
    guess = guess.lower() 

    if not guess.isalpha(): 
     is_valid = False 
    elif len(guess) !=1: 
     is_valid = False 
    else: 
     is_valid = True 

    while is_valid == False: 
     messagebox.showinfo("Error:","Invalid input. Please enter a letter from a-z.") 
     break 

    hint.set(getHint(word, guesses)) 
    return hint 

label_instruct = Label(root, text="Please enter your guess: ") 
label_instruct.grid(row=1,column=1,padx=5,pady=10) 

guess_input = Entry(root,textvariable=guess_input) 
guess_input.grid(row=1, column=2) 

guess_button = Button(root, text="Guess", width=15, command=guessButton(guess_input,word,guesses)) 
guess_button.grid(row=1, column=3,padx=15) 

current_hint = Label(root, textvariable=hint) 
current_hint.grid(column=2,row=2) 

label_hint = Label(root, text="Current hint:") 
label_hint.grid(column=1,row=2) 

label_remaining = Label(root, text="Remaining guesses: ") 
label_remaining.grid(column=1,row=3) 

root.mainloop() # the window is now displayed 

Alle Tipps sind erwünscht.

Antwort

0

Es gibt zwei offensichtliche Probleme.

Zunächst sollten Sie nicht

guess_button = Button(root, text="Guess", width=15, command=guessButton(guess_input,word,guesses)) 

verwenden, da Sie keine Funktion mit Argumenten auf der Kommando Config aufrufen können.

würde Mein Vorschlag einen Blick here und eine der vorgeschlagenen Methoden, besonders gefällt mir die man verwenden nehmen mit functools und partial:

from functools import partial 
#(...) 
button = Tk.Button(master=frame, text='press', command=partial(action, arg)) 

mit action ist die Funktion, die Sie anrufen möchten, und arg die Parameter, die Sie aufrufen möchten, getrennt durch ein Komma.

Zweitens Sie verwenden

guess = str(guess_input) 

die nicht die Eingabe getippten Text zurückgibt, anstatt

guess = guess_input.get() 

PS zu verwenden: Wenn auch nicht direkt mit Ihrer Frage, sollten Sie Verwenden Sie

if var is False: 

anstelle von

if var == False: 
+0

Danke, ich habe dies vor einer Weile eingereicht, aber aus dem Speicher Ihre Lösung hat mir geholfen. Prost –

Verwandte Themen