繁体   English   中英

在 Python 中获取输入 tkinter 按下按钮时输入

[英]Get input in Python tkinter Entry when Button pressed

我正在尝试使用 Pyhon tkinter 制作“猜数字”游戏,但到目前为止我无法从用户那里检索输入。

按下b1时如何获取entry中的输入?

我还想显示一个较低或较高的消息作为玩家的线索,但我不确定我所拥有的是否正确:

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)

您可以在main中定义get ,以便您可以访问预先创建的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)

您已经乱序组装了随机的代码行。 例如, root.mainloop()只应在设置代码后调用一次,但您在main()中间调用它,这样之后的任何内容都不会执行,直到 Tk 被拆除。 while guess != randomnum:循环在事件驱动代码中没有位置。 而这,不管它是什么,真的应该在前面加上一条评论:

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

让我们采用一种更简单、更清洁的方法。 与其抓住指向各种小部件的指针,不如使用它们的textvariablecommand属性来运行节目并在设置后忽略小部件。 我们将使用StringVarIntVar来处理输入和输出。 我们将使用after()功能,而不是使用引发事件的sleep()

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

这是数字猜谜游戏的tkinter版本。

whileafter不使用!

程序检查非法输入(空字符串或单词)并报告错误消息。 它还跟踪猜测数字所需的尝试次数,并用大红色横幅报告成功。

我为小部件赋予了更有意义的名称,并使用了pack管理器而不是grid

您可以使用按钮输入您的猜测或只需按回车键。

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

猜数的正确写法。

  • 我在get_number() function 中为 Python 中的数字猜谜游戏编写了一个小脚本。
  • 使用一个小部件来更新Label而不是复制。
  • 我为您输入的圈数添加了一些额外的内容。

代码修改:

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 用于输入浮点数:

在此处输入图像描述

Output 猜高后:

在此处输入图像描述

Output 猜测低后:

在此处输入图像描述

Output 你赢了和轮数:

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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