Получить ввод в Python tkinter Entry при нажатии кнопки - PullRequest
0 голосов
/ 27 сентября 2018

Я пытаюсь создать игру «угадай число» с Pyhon tkinter, но до сих пор не смог получить ввод от пользователя.

Как я могу получить ввод в entryкогда нажата b1?

Я также хочу показать более низкое или более высокое сообщение в качестве подсказки для игрока, но я не уверен, правильно ли то, что у меня есть:

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)

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Вы собрали случайные строки кода не по порядку.Например, root.mainloop() должен вызываться только один раз после настройки кода, но вы вызываете его в середине main(), так что все после не будет выполняться, пока Tk не будет разрушен.И цикл while guess != randomnum: не имеет места в коде, управляемом событиями.И этому, как бы то ни было, действительно должен предшествовать комментарий:

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

Давайте возьмем более простой и понятный подход.Вместо того чтобы держаться за указатели на различные виджеты, давайте использовать их свойства textvariable и command, чтобы запустить шоу и игнорировать виджеты после установки.Мы будем использовать StringVar и IntVar для обработки ввода и вывода.И вместо использования sleep(), который отбрасывает наши события, мы будем использовать функцию after():

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()
0 голосов
/ 28 сентября 2018

Вы можете определить get внутри main, чтобы получить доступ к ранее созданному виджету entry, например:

entry = tk.Entry()
    def get():
        guess = entry.get()
        return guess # Replace this with the actual processing.
    b1 = tk.Button(root, text="Guess", command=get)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...