【问题标题】:Get input in Python tkinter Entry when Button pressed按下按钮时在 Python tkinter 条目中获取输入
【发布时间】:2022-01-12 03:01:55
【问题描述】:

我正在尝试使用 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)

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

    您可以在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)
    

    【讨论】:

      【解决方案2】:

      您已经乱序组装了随机的代码行。例如,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()
      

      【讨论】:

        【解决方案3】:

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

        whileafter 未使用!

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

        我为小部件赋予了更有意义的名称,并使用了pack manager 而不是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()
        

        【讨论】:

        • -&gt; 通常表示函数返回的内容右边,文档字符串放在右边
        • 使用 tkinter 完全重写。
        猜你喜欢
        • 1970-01-01
        • 2021-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多