首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将变量与.get()比较时出现问题

将变量与.get()比较时出现问题
EN

Stack Overflow用户
提问于 2019-04-25 03:27:42
回答 4查看 61关注 0票数 0

我有一个问题,我不知道如何比较一个变量和一个条目的.get(),那么问题是什么呢?

我是巨蟒新手,我是法国人

我的代码:

代码语言:javascript
复制
from tkinter import *
from random import *
from tkinter.messagebox import *

liste = ["A TI TA", "B TA TI TI TI", "C TA TI TA TI", "D TA TI TI", "E TI", "F TI TI TA TI", "G TA TA TI", "H TI TI TI TI", "I TI TI", "J TI TA TA TA", "K TA TI TA", "L TI TA TI TI", "M TA TA", "N TA TI", "O TA TA TA", "P TI TA TA TI", "Q TA TA TI TA", "R TI TA TI", "S TI TI TI", "T TA", "U TI TI TA", "V TI TI TI TA", "W TI TA TA", "X TA TI TI TA", "Y TA TI TA TA", "Z TA TA TI TI"]

class Interface(Frame):
    def __init__(self, fenetre, **kwargs):

    def cliquer():
        lettrer = choice(liste)
        self.lettre["text"] = lettrer

    def verification():
        if saisie.get() == (lettrer):
            showinfo("Saisie correcte", "Saisie correcte")
        else:
            showinfo("Erreur", "ERREUR")

    Frame.__init__(self, fenetre, width=768, height=576, **kwargs)
    self.pack(fill=BOTH)


    self.message2 = Label(self, text="APRENDRE LE CODE MORSE")
    self.message2.pack(side="top")

    self.message = Label(self, text="Cliquez sur générer")
    self.message.pack()

    self.lettre = Label(self, text="")
    self.lettre.pack()

    saisie= StringVar()
    self.champ = Entry(self, textvariable = saisie, bg = "bisque", fg = "maroon")
    self.champ.focus_set()
    self.champ.pack()

    self.bouton_quitter = Button(self, text="Quitter", command=self.quit)
    self.bouton_quitter.pack(side="left")

    self.bouton_cliquer = Button(self, text="Generer", textvariable = "lettrer", command = cliquer)
    self.bouton_cliquer.pack(side="right")

    self.confirmbouton = Button(self, text="Valider", command = verification)
    self.confirmbouton.pack()


fenetre = Tk()
interface = Interface(fenetre)

interface.mainloop()
interface.destroy()

当我按下"valider“时,我的错误:

代码语言:javascript
复制
Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\albru\AppData\Local\Programs\Python\Python37\lib\tkinter\__init__.py", line 1705, in __call__
    return self.func(*args)
  File "C:/Users/albru/.PyCharmCE2018.3/config/scratches/interface.py", line 15, in verification
    if saisie.get() == (lettrer):
NameError: name 'lettrer' is not defined

ZeEleveZozo

EN

回答 4

Stack Overflow用户

发布于 2019-04-25 03:40:18

该函数的作用域中没有lettrer,您需要改用self.lettrer。因此,将"if saisie.get() == (lettrer):“改为"if saisie.get() == (self.lettrer):”。

票数 0
EN

Stack Overflow用户

发布于 2019-04-25 03:56:07

此时:

代码语言:javascript
复制
if saisie.get() == (lettrer):
            showinfo("Saisie correcte", "Saisie correcte")

未定义lettrer。为什么?因为lettrer不是全局变量。它是Interface的一个实例变量。为了表明您想要将saisie.get()与实例变量lettrer进行比较,您需要在其前面加上self.,如下所示:

代码语言:javascript
复制
if saisie.get() == self.lettrer:  # I removed the redundant parantheses
            showinfo("Saisie correcte", "Saisie correcte")
票数 0
EN

Stack Overflow用户

发布于 2019-04-25 03:56:18

在使用oops和tkinter时,尽量使用self (self.saisie = StringVar())使类中的每个变量成为全局变量,特别是当您在不同函数中使用该变量时。

此外,在类内定义函数并不是一种糟糕的方法,但如果在类外使用self来定义它,效果会更好。

还有一件事,如果你先按‘生成器’按钮,然后再按‘放弃’按钮,它会给出一个错误,这是因为'lettrer‘变量只有在你按’放弃‘按钮时才会定义,所以你要么在__init__中将其定义为self.lettrer = None,要么通过self.lettrer = choice(liste)随机选择。这将防止出现以下错误:AttributeError: 'Interface' object has no attribute 'lettrer'

下面是更新后的代码:

代码语言:javascript
复制
from tkinter import *
from random import *
from tkinter.messagebox import *

liste = ["A TI TA", "B TA TI TI TI", "C TA TI TA TI", "D TA TI TI", "E TI", "F TI TI TA TI", "G TA TA TI", "H TI TI TI TI", "I TI TI", "J TI TA TA TA", "K TA TI TA", "L TI TA TI TI", "M TA TA", "N TA TI", "O TA TA TA", "P TI TA TA TI", "Q TA TA TI TA", "R TI TA TI", "S TI TI TI", "T TA", "U TI TI TA", "V TI TI TI TA", "W TI TA TA", "X TA TI TI TA", "Y TA TI TA TA", "Z TA TA TI TI"]

class Interface(Frame):
    def __init__(self, fenetre, **kwargs):

        Frame.__init__(self, fenetre, width=768, height=576, **kwargs)
        self.pack(fill=BOTH)

        self.lettrer = choice(liste)
        self.message2 = Label(self, text="APRENDRE LE CODE MORSE")
        self.message2.pack(side="top")

        self.message = Label(self, text="Cliquez sur générer")
        self.message.pack()

        self.lettre = Label(self, text="")
        self.lettre.pack()

        self.saisie= StringVar()
        self.champ = Entry(self, textvariable = self.saisie, bg = "bisque", fg = "maroon")
        self.champ.focus_set()
        self.champ.pack()

        self.bouton_quitter = Button(self, text="Quitter", command=self.quit)
        self.bouton_quitter.pack(side="left")

        self.bouton_cliquer = Button(self, text="Generer", textvariable = "lettrer", command = self.cliquer)
        self.bouton_cliquer.pack(side="right")

        self.confirmbouton = Button(self, text="Valider", command = self.verification)
        self.confirmbouton.pack()

    def cliquer(self):
        self.lettrer = choice(liste)
        self.lettre["text"] = self.lettrer

    def verification(self):
        if self.saisie.get() == self.lettrer:
            showinfo("Saisie correcte", "Saisie correcte")
        else:
            showinfo("Erreur", "ERREUR")


fenetre = Tk()
interface = Interface(fenetre)

interface.mainloop()
interface.destroy()

我希望这对你有帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55837224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档