2017-10-04 6 views
0

J'ai passé de nombreuses heures à essayer de remplacer les widgets askinteger et asktring par des widgets d'entrée simples dans ce code. Je suis sûr qu'il existe un moyen simple de transmettre les informations du widget d'entrée afin qu'il puisse être utilisé dans d'autres fonctions du code, mais tout ce que j'ai recherché et essayé a échoué. Toute aide sera la bienvenue.Comment rendre les données du widget d'entrée Tkinter disponibles pour d'autres fonctions?

from tkinter import * 
from tkinter.simpledialog import askinteger 
from tkinter.simpledialog import askstring 
from random import randrange 


def read_file(words_file): 
    with open(words_file, 'r') as f: # Read the text file 
     wordList = [] # Create an empty string called wordList 
     for line in f: # For every line in the text file 
      wordList += line.split() # Add another item to the list 
     f.close() 
     return wordList # Return the list 


def select_word(wordList, word): 
    wordLength = 0 

    length = askinteger("Letters", "How Many Letters?") # Ask user for  amount of letters 

    while wordLength != length: 
     wordNumber = randrange(0, len(wordList)) # Randomly select a number between 0 and length of wordList 
     word = wordList[wordNumber] # Select a word from the list using wordNumber 
     word = word.upper() 
     wordLength = len(word) # Calculate the length of the selected word 
    return word 

def get_letter(): 

    letter = askstring("Please enter a letter", "Which letter would you like to try?") 

    letter = letter.upper() # Convert letter to uppercase 
    return letter 

C'est le genre de choses que j'ai essayées. J'ai aussi utilisé stringvar.

from tkinter import * 

master = Tk() 
e = Entry(master) 
e.pack() 
e.focus_set() 

def callback(): 
    print (e.get()) 
    global fred 
    fred = e.get() 
    print(fred) 
    return fred 

b = Button(master, text="get", width=10, command=callback) 
b.pack() 

print(fred) 

mainloop() 

Nous vous remercions de votre conseil. J'ai maintenant essayé ce qui suit, mais je n'arrive toujours pas à faire fonctionner la fonction d'impression (fred). Je suis sûr que c'est une erreur stupide mais je ne peux pas voir ce que je fais mal.

from tkinter import * 

master = Tk() 
e = Entry(master) 
e.pack() 
e.focus_set() 

fred = ''  # declare fred in the outer scope 

def callback(): 
    print (e.get()) 
    fred = (e.get()) 
    return fred # removed global statement as I understand they should be avoided 

b = Button(master, text="get", width=10, command=callback) 
b.pack() 

print(fred) 

mainloop() 

Répondre

0

Vous devez définir fred variable dans le champ extérieur afin de le récupérer. (Il existe d'autres moyens, mais c'est la façon dont votre code est construit):

from tkinter import * 

master = Tk() 
e = Entry(master) 
e.pack() 
e.focus_set() 

fred = ''  # declare fred in the outer scope 

def callback(): 
    print (e.get()) 
    global fred 
    fred = e.get() 
    print(fred) 
    # return fred # as fred is global, returning it is optional 

b = Button(master, text="get", width=10, command=callback) 
b.pack() 

mainloop() 

fred contiendra la valeur récupérée à partir du champ entry, et être disponibles pour un traitement ultérieur

+0

La 'print (fred)' (que j'ai enlevé) n'est jamais appelé après que le 'mainloop()' ait commencé; après le rappel, la valeur de 'fred' est définie sur celle de' entry'. Vous pouvez l'utiliser pour mettre à jour une étiquette si vous le souhaitez, ou faire autre chose que vous aimez. –