我想在按下按钮时获取条目的值,但是由于条目是功能,所以我找不到方法。
我试图在输入之前放置一个全局变量,但是它不起作用
#coding:utf-8
from Tkinter import *
from random import *
def nb1():
nb=randint(0,16)
jeu(nb)
def checkansw():
answ = entryansw.get()
if answ == int(nb, 2):
showinfo('Résultat','Bravo !')
restart()
else:
showwarning('Résultat','Incorrect !')
entryansw.set('')
def jeu(nb):
nb=format(nb, 'b')
root.destroy()
root2 = Tk()
root2.title("Binary Game")
root2.geometry("500x350+50+50")
root2.resizable(width=False, height=False)
root2['bg'] = 'black'
entryansw = Entry(root2, width=5, font=("Courier New", 20),
justify=CENTER).pack(side=TOP, pady=30)
boutonvalid = Button(root2, text="Valider",
highlightbackground="black", command=checkansw).pack()
root2.mainloop()
root = Tk()
root.geometry("500x350+50+50")
root.resizable(width=False, height=False)
root['bg'] = 'black'
choixdif = Label(root, pady=25, text="Veuillez choisir la
difficulté.", font =("Courier New", 18), bg="black",
fg="green").pack()
boutondif1 = Button(root, text="Facile", highlightbackground
="black", command=nb1).pack()
root.mainloop()
答案 0 :(得分:0)
您可以通过设置文本变量从Entry获得价值
entryansw_textvariable = StringVar()
entryansw = Entry(root2, width=5, font=("Courier New", 20), justify=CENTER, textvariable=entryansw_textvariable).pack(side=TOP, pady=30)
answ = entryansw_textvariable.get()
您可以获取详细信息here
答案 1 :(得分:0)
您的问题有两个部分。首先是处理变量的范围。就像您说的那样,您可以为变量global
声明entryansw
:
def checkansw():
global entryansw
answ = entryansw.get()
...
def jeu(nb):
global entryansw
...
或者,您可以先在主函数中定义一个占位符,然后将由函数创建的小部件附加到占位符:
from tkinter import *
widget = []
def checkansw():
answ = widget[0].get()
if answ == int(nb, 2):
pass
else:
widget[0].set('')
def jeu(nb):
...
entryansw = Entry(root2, width=5, font=("Courier New", 20),justify=CENTER).pack(side=TOP, pady=30)
widget.append(entryansw)
....
当然,您可以定义一个class
来处理此问题:
class JEU:
def __init__(self):
nb=randint(0,16)
self.jeu(nb)
def checkansw(self):
answ = self.entryansw.get()
if answ == int(nb, 2):
pass
else:
self.entryansw.set('')
def jeu(self,nb):
nb=format(nb, 'b')
root.destroy()
root2 = Tk()
root2.title("Binary Game")
root2.geometry("500x350+50+50")
root2.resizable(width=False, height=False)
root2['bg'] = 'black'
self.entryansw = Entry(root2, width=5, font=("Courier New", 20),justify=CENTER).pack(side=TOP, pady=30)
boutonvalid = Button(root2, text="Valider",highlightbackground="black", command=self.checkansw).pack()
root2.mainloop()
以上任何方法都可以解决范围问题,但是由于以下代码,它仍然无法工作:
entryansw = Entry(root2, width=5, font=("Courier New", 20),justify=CENTER).pack(side=TOP, pady=30)
直接打包时,变量entryansw
成为对pack
方法的引用,该方法是一个None类型的对象:
<class 'NoneType'>
要正确引用entryansw
,应单独调用pack方法:
entryansw = Entry(root2, width=5, font=("Courier New", 20),justify=CENTER)
entryansw.pack(side=TOP, pady=30)
现在entryansw
的类型成为适当的小部件。
<class 'tkinter.Entry'>
仍然,您的代码还有很多需要改进的地方,例如将set
用于entry
小部件,两次调用mainloop
...