Get input in Python tkinter Entry when Button pressed

守給你的承諾、 提交于 2021-01-29 06:21:11

问题


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)

回答1:


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)



回答2:


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


来源:https://stackoverflow.com/questions/52544108/get-input-in-python-tkinter-entry-when-button-pressed

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!