【问题标题】:Assign value from a Tkinter Entry to a Python variable将 Tkinter 条目中的值分配给 Python 变量
【发布时间】:2018-08-30 20:47:24
【问题描述】:

我目前正在学习 python,但遇到了障碍。我从 java 开始,喜欢将 JOptionPane 用于输入对话框,并使用这些对话框将值分配给变量并从那里解析它们。

在 python 中,我注意到人们将 Tkinter 用于大多数基本的 gui 设置,但我找不到很多关于如何使用用 tkinter 创建的文本框为变量赋值的信息。我的代码如下:

import random
import tkinter as tk

def guess():
    global entry
    guess = entry.get()
    guessN = int(guess)


root1 = tk.Tk()

label = tk.Label(root1, text='What number am I thinking of between 1 and 100?')
entry = tk.Entry(root1)
entry.focus_set()

b = tk.Button(root1,text='okay',command=guess)
b.pack(side='bottom')

label.pack(side = tk.TOP)
entry.pack()

root1.mainloop():

x = random.randint(1,101)

guess()
tries = 0

while guessN != x:
    if (guessN < x):
        guess = input("Too low! Try again.")
        guessN = int(guess)
        tries += 1
    else:
        guess = input("Too high! Try again.")
        guessN = int(guess)        
        tries += 1

print('Congratulations you guessed the number', x, 'in', tries, 'tries!')
SystemExit

我想使用 tkinter 将输入分配给guess,然后使用guessN 检查随机生成的数字。我不确定从这里往哪里走,或者如何不断检查,如果猜测不正确,则重新分配变量。

【问题讨论】:

  • root1.mainloop(): 不是有效的 Python 顺便说一句。

标签: python input tkinter user-input


【解决方案1】:

手动

根据The Tkinter Entry Widget

首先,您可以从Entry 中读取值

entry.get()

其次,您可以将它绑定到tkinter.Variable(它创建并包装一个具有自动生成名称的 Tcl 全局变量)。通常使用它的子类StringVar——它在获取/设置时将值转换为str

v = tkinter.StringVar()
entry = tk.Entry(root1, textvariable=v)

<...>
value = v.get()

如您所见,差别不大,只是增加了一个间接级别。这两种方法都会给你一个str,所以你需要用int()解析它。但是您可以使用IntVar 而不是Variable(或StringVar),它将在.get() 上为您解析它(如果它不是有效整数,则会引发ValueError)。

自动

要在Entry 的值更改时自动g更新 Python 变量,请使用 Variable.trace_add

def callback(tcl_name,index,op):
    global myvar
    # See https://tcl.tk/man/tcl8.6/TclCmd/trace.htm#M14 about the arguments.
    # A callback is only passed the name of the underlying Tcl variable
    # so have to construct a new Variable of the same class on the fly 
    # that wraps it to get the value and convert it to the appropriate type.
    # Yes, it's this hacky.
    try: myvar = StringVar(tcl_name).get()
    except ValueError: myvar = None

v.trace_add("write",callback)

callback 的一个不那么 hacky 的解决方案是让回调成为 Variable 的实例方法——这样,它将通过 self 获得对它的引用,而不必构造一个新类实例。该值也可以作为实例属性:

def callback(self,*args):
    try: self.value=self.get()
    except ValueError: self.value=None

v.callback=callback
v.trace_add("write",v.callback)

请注意,这将在每次更改时调用 - 即即使在您键入值时 - 因此可能会导致 GUI 反应明显延迟。因此,除非您确实需要持续监控该值,否则只需在适当的时候读取一次就足够了。

【讨论】:

    猜你喜欢
    • 2018-08-23
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    相关资源
    最近更新 更多