首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将Tkinter Entry中的值赋给Python变量

将Tkinter Entry中的值赋给Python变量
EN

Stack Overflow用户
提问于 2018-08-31 04:56:57
回答 1查看 0关注 0票数 0

我正在学习python并遇到了障碍。我从java开始,喜欢使用JOptionPane作为输入对话框,并使用这些对话框为变量赋值并从那里解析它们。

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

代码语言:javascript
复制
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来检查随机生成的数字。我不确定从这里开始,或如何连续检查,如果猜测不正确则重新分配变量。

EN

回答 1

Stack Overflow用户

发布于 2018-08-31 14:24:04

手动

按照该Tkinter的Entry控件

首先,你可以阅读从价值Entry

代码语言:javascript
复制
entry.get()

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

代码语言:javascript
复制
v = tkinter.StringVar()
entry = tk.Entry(root1, textvariable=v)

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

你可以看到,没有太大的区别,只增加了一个间接层。这两种方法都会让你得到一个str所以你需要解析它int()。但你可以使用一个IntVar而不是Variable(或StringVar)来解析它.get()ValueError如果它不是一个有效的整数,它将会提升)。

自动

到AUTOMA ically更新Python变量时Entry的值的变化,使用Variable.trace_add

代码语言:javascript
复制
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)

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

代码语言:javascript
复制
def callback(self,*args):
    try: self.value=self.get()
    except ValueError: self.value=None

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

请注意,这将在每次更改时调用- 即使您键入值 - 因此可能会导致GUI反应明显延迟。因此,除非你真的需要不断监控价值,否则只需在适当的时候阅读一次即可。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100006094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档