簡體   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