我目前正在学习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将输入分配给猜测,然后使用guessN检查随机生成的数字。我真的不确定从哪里去,或者如何连续检查,如果猜测不正确,请重新分配变量。
答案 0 :(得分:1)
首先,您可以使用{p1}从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
来说,一个比较不客气的解决方案是使回调成为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反应明显延迟。因此,除非您确实需要不断监控该值,否则在适当的时候仅读取一次就足够了。