Ваша проблема состоит из двух частей.Первый имеет дело с областью действия ваших переменных.Как вы сказали, вы можете объявить 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'>
Stillесть еще пара вещей, которые нужно улучшить для вашего кода, например, используя set
для вашего entry
виджета, дважды вызывая mainloop
...