Проблема сравнить переменную с .get () - PullRequest
0 голосов
/ 24 апреля 2019

У меня проблема, я не знаю, как сравнить переменную с .get() записи, так в чем же проблема?

Я новичок в Python и я француз

Мой код:

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":

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

Ответы [ 4 ]

0 голосов
/ 24 апреля 2019

ниже моей версии, если еще не поздно;)

#!/usr/bin/python3
import tkinter as tk
from tkinter import ttk
from tkinter import messagebox
import random


class Main(ttk.Frame):
    def __init__(self, parent):
        super().__init__()

        self.parent = parent

        self.saisie = tk.StringVar()
        self.letre = tk.StringVar()
        self.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"]

        self.init_ui()

    def init_ui(self):

        self.pack(fill=tk.BOTH, expand=1)

        f = ttk.Frame()
        ttk.Label(f, text = "APRENDRE LE CODE MORSE").pack()
        ttk.Label(f, text = "Cliquez sur générer").pack()
        ttk.Label(f, textvariable = self.letre).pack()
        self.champ = tk.Entry(f,
                              textvariable = self.saisie,
                              bg = "bisque",
                              fg = "maroon")
        self.champ.pack()
        self.champ.focus_set()

        w = ttk.Frame()

        ttk.Button(w, text="Generer",command=self.cliquer).pack()
        ttk.Button(w, text="Valider", command=self.verification).pack()
        ttk.Button(w, text="Quitter", command=self.on_close).pack()


        w.pack(side=tk.RIGHT, fill=tk.BOTH, expand=1)
        f.pack(side=tk.LEFT, fill=tk.BOTH, expand=1)


    def cliquer(self,):
        lettrer = random.choice(self.liste)
        self.letre.set(lettrer)

    def verification(self):
        if self.saisie.get():

            if self.saisie.get() == (self.letre.get()):
                msg ="Saisie correcte"
            else:
                msg="Erreur"

            messagebox.showinfo(self.parent.title, msg)
        else:
            messagebox.showwarning(self.parent.title, 'Please fill saisie field')

    def on_close(self):
        self.parent.on_exit()


class App(tk.Tk):
    """Start here"""

    def __init__(self):
        super().__init__()

        self.protocol("WM_DELETE_WINDOW", self.on_exit)

        self.set_style()
        self.set_title() 
        Main(self,)     

    def set_style(self):
        self.style = ttk.Style()
        #('winnative', 'clam', 'alt', 'default', 'classic', 'vista', 'xpnative')
        self.style.theme_use("clam")

    def set_title(self):
        s = "{0}".format('MORSE')
        self.title(s)

    def on_exit(self):
        """Close all"""
        if messagebox.askokcancel( self.title(), "Do you want to quit?", parent=self):
            self.destroy()               

if __name__ == '__main__':
    app = App()
    app.mainloop()

enter image description here

0 голосов
/ 24 апреля 2019

На данный момент:

if saisie.get() == (lettrer):
            showinfo("Saisie correcte", "Saisie correcte")

lettrer не определено.Зачем?Потому что lettrer не является глобальной переменной.Это переменная экземпляра Interface.Чтобы указать, что вы хотите сравнить saisie.get() с переменной экземпляра lettrer, вам необходимо добавить к ней self. следующим образом:

if saisie.get() == self.lettrer:  # I removed the redundant parantheses
            showinfo("Saisie correcte", "Saisie correcte")
0 голосов
/ 24 апреля 2019

Когда вы используете oops с tkinter, попробуйте сделать каждую переменную глобальной в классе с использованием self (self.saisie = StringVar()), особенно когда вы используете эту переменную в другой функции.

Также определение функции внутри не является плохим подходом, но может быть лучше, если вы определите ее с помощью self вне класса.

Еще одна вещь, которая выдает ошибку, если вы нажимаете кнопку 'Generer' перед нажатием кнопки 'Quitter', это потому, что переменная 'lettrer' будет определять только если вы нажмете 'Quitter', так что либо вы определяете ее в __init__ как self.lettrer = None или просто дать первый случайный выбор self.lettrer = choice(liste). Это предотвратит вас от ошибки: AttributeError: 'Interface' object has no attribute 'lettrer'.

Вот обновленный код:

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 голосов
/ 24 апреля 2019

В области действия этой функции нет lettrer, вместо этого вам нужно использовать self.lettrer.Поэтому измените "if saisie.get () == (lettrer):" на "if saisie.get () == (self.lettrer):".

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