entry.get () из функции - PullRequest
       4

entry.get () из функции

0 голосов
/ 01 января 2019

Я хочу получить значение записи, когда я нажимаю кнопку, но я не могу найти способ сделать это, потому что запись в функции.

Я пытался поставить глобальный передзапись, но она не работает

#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()

Ответы [ 2 ]

0 голосов
/ 01 января 2019

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

0 голосов
/ 01 января 2019

Вы можете получить значение из 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()

Вы можете получить подробную информацию здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...