来自函数的entry.get()

时间:2019-01-01 10:29:10

标签: python-2.7 tkinter

我想在按下按钮时获取条目的值,但是由于条目是功能,所以我找不到方法。

我试图在输入之前放置一个全局变量,但是它不起作用

#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 :(得分: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 ...