简体   繁体   中英

Get input in Python tkinter Entry when Button pressed

I am trying to make a 'guess the number' game with Pyhon tkinter but so far I have not been able to retrieve the input from the user.

How can I get the input in entry when b1 is pressed?

I also want to display a lower or higher message as a clue to the player but I am not sure if what I have is right:

import time
import random
import decimal
import tkinter as tk

root = tk.Tk()

randomnum = float(decimal.Decimal(random.randrange(100,10000))/100)
guess = 0

def get(entry):
    guess = entry.get()
    return guess

def main():
    b1 = tk.Button(root, text="Guess", command=get)
    entry = tk.Entry()
    b1.grid(column=1, row=0)
    entry.grid(column=0, row=0)
    root.mainloop()
    print(guess)
    if guess < randomnum:
        l2 = tk.Label(root, text="Higher!")
        l2.grid(column=0, row=2)
    elif guess > randomnum:
        l3 = tk.Label(root, text="Lower!")
        l3.grid(column=0, row=2)


while guess != randomnum:
    main()
l4 = tk.Label(root, text="Well guessed")
time.sleep(10)

You could define get inside main , so that you can access the entry widget you created beforehand, like this:

entry = tk.Entry()
    def get():
        guess = entry.get()
        return guess # Replace this with the actual processing.
    b1 = tk.Button(root, text="Guess", command=get)

You've assembled random lines of code out of order. For example, the root.mainloop() should only be called once after setting up the code but you're calling it in the middle of main() such that anything after won't execute until Tk is torn down. And the while guess != randomnum: loop has no place in event-driven code. And this, whatever it is, really should be preceded by a comment:

randomnum = float(decimal.Decimal(random.randrange(100,10000))/100)

Let's take a simpler, cleaner approach. Rather than holding onto pointers to the the various widgets, let's use their textvariable and command properties to run the show and ignore the widgets once setup. We'll use StringVar and IntVar to handle input and output. And instead of using sleep() which throws off our events, we'll use the after() feature:

import tkinter as tk
from random import randint

def get():
    number = guess.get()

    if number < random_number:
        hint.set("Higher!")
        root.after(1000, clear_hint)
    elif number > random_number:
        hint.set("Lower!")
        root.after(1000, clear_hint)
    else:
        hint.set("Well guessed!")
        root.after(5000, setup)

def setup():
    global random_number

    random_number = randint(1, 100)
    guess.set(0)
    hint.set("Start Guessing!")
    root.after(2000, clear_hint)

def clear_hint():
    hint.set("")

root = tk.Tk()

hint = tk.StringVar()
guess = tk.IntVar()

random_number = 0

tk.Entry(textvariable=guess).grid(column=0, row=0)
tk.Button(root, text="Guess", command=get).grid(column=1, row=0)
tk.Label(root, textvariable=hint).grid(column=0, row=1)

setup()

root.mainloop()

Here is a tkinter version on the number guessing game.

while or after are not used!

Program checks for illegal input (empty str or words) and reports error message. It also keeps track of the number of tries required to guess the number and reports success with a big red banner.

I've given more meaningful names to widgets and used pack manager instead of grid .

You can use the button to enter your guess or simply press Return key.

import time
import random
import tkinter as tk

root = tk.Tk()
root.title( "The Number Guessing Game" )

count = guess = 0

label = tk.Label(root, text = "The Number Guessing Game", font = "Helvetica 20 italic")
label.pack(fill = tk.BOTH, expand = True)

def pick_number():
    global randomnum
    label.config( text = "I am tkinking of a Number", fg = "black" )
    randomnum = random.choice( range( 10000 ) )/100
    entry.focus_force()

def main_game(guess):
    global count
    count = count + 1
    entry.delete("0", "end")
    if guess < randomnum:
        label[ "text" ] = "Higher!"
    elif guess > randomnum:
        label[ "text" ] = "Lower!"
    else:
        label.config( text = f"CORRECT! You got it in {count} tries", fg = "red" )
        root.update()
        time.sleep( 4 )
        pick_number()
        count = 0

def get( ev = None ):
    guess = entry.get()
    if len( guess ) > 0 and guess.lower() == guess.upper():
        guess = float( guess )
        main_game( guess )
    else:
        label[ "text" ] = "MUST be A NUMBER"
        entry.delete("0", "end")
               

entry = tk.Entry(root, font = "Helvetica 15 normal")
entry.pack(fill = tk.BOTH, expand = True)
entry.bind("<Return>", get)
b1 = tk.Button(root, text = "Guess", command = get)
b1.pack(fill = tk.BOTH, expand = True)

pick_number()

root.geometry( "470x110" )
root.minsize( 470, 110 )

root.mainloop()

Correct way to write guess number.

  • I write a small script for number guessing game in Python in get_number() function.
  • Used one widget to update Label instead of duplicating.
  • I added some extra for number of turns that you entered.

Code modified:

import time
import random
import decimal
import tkinter as tk

root = tk.Tk()

randomnum = float(decimal.Decimal(random.randrange(100,10000))/100)
print(randomnum)

WIN = False
GUESS = 0
TURNS = 0

Vars = tk.StringVar(root) 

def get_number():
    global TURNS
    while WIN == False:
        Your_guess = entry.get()
        
        if randomnum == float(Your_guess):
            guess_message = f"You won!"             
            l3.configure(text=guess_message)
           
            number_of_turns = f"Number of turns you have used: {TURNS}"
            l4.configure(text=number_of_turns)
            l4.grid(column=0, row=3, columnspan=3, pady=5)
            
            WIN == True
            break
        else:
            if randomnum > float(Your_guess):
                guess_message = f"Your Guess was low, Please enter a higher number"                 
            else:
                guess_message = f"your guess was high, please enter a lower number"
                
        l3.configure(text=guess_message)
        l3.grid(column=0, row=2, columnspan=3, pady=5)
        TURNS +=1        
        return Your_guess

label = tk.Label(root, text="The Number Guessing Game", font="Helvetica 12 italic")
label.grid(column=0, row=0, columnspan=3, sticky='we')

l2 = tk.Label(root, text='Enter a number between 1 and 100',
              fg='white', bg='blue')
l2.grid(row=1, column=0, sticky='we')

entry = tk.Entry(root, width=10, textvariable=Vars)
entry.grid(column=1, row=1, padx=5,sticky='w')

b1 = tk.Button(root, text="Guess", command=get_number)    
b1.grid(column=1, row=1, sticky='e', padx=75) 

l3 = tk.Label(root, width=40, fg='white', bg='red' )
 
l4 = tk.Label(root, width=40, fg='white', bg='black' )
 

root.mainloop()

while guess:         
    time.sleep(10)

Output for enter floating numbers:

在此处输入图像描述

Output after the guess was high:

在此处输入图像描述

Output after the guess was low:

在此处输入图像描述

Output You won and number of turns:

在此处输入图像描述

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM