Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • Home
  • SEARCH
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 6870239
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 27, 20262026-05-27T03:39:33+00:00 2026-05-27T03:39:33+00:00

I’m not getting any error but the code doesn’t do what I want so

  • 0

I’m not getting any error but the code doesn’t do what I want so there must be somewhere in the code where I have made a mistake. What I want to do is if the words match then the words must be a pair and the two chosen cells should remain “self.hidden = False” and therefore the cells should still show the words behind the two cells. Else if the words doesn’t match then the cells should be “self.hidden = True” and the two cells should show “—“.

Here are the important parts:

from tkinter import *
import random

class Cell:
    def __init__(self, word, hidden):
        self.word = word
        self.hidden = hidden

    def show_word(self):
        """ Shows the word behind the cell """
        if self.hidden == True:
            self.hidden = False
        else:
            self.hidden = True

        self.button["text"] = str(self)

        if mem.choice1 == None:
            mem.choice1 = [self.word, self.hidden]
        else:
            mem.choice2 = [self.word, self.hidden]
            self.check(mem.choice1, mem.choice2)

    def check(self, choice1, choice2):
        """ Checks if the chosen words are a pair """
        tries = 0
        if choice1 == choice2:
            pass
        else:
            self.show_word

        tries += 1

    def __str__(self):
        """ Displays or hides the word """
        if self.hidden == True:
            return "---"
        else:
            return self.word

class Memory(Frame):
    """ GUI application that creates a Memory game """
    def __init__(self, master):
        super(Memory, self).__init__(master)
        self.grid()
        self.create_widgets()
        self.tries = 0
        self.choice1 = None
        self.choice2 = None

    def readShuffle(self):
        """ Creates and organizes (shuffles) the pairs in a list """
        # reads the file and creates a list of the words
        words_file = open("memo.txt","r")
        row = words_file.readline()
        words = list()
        while row != "":
            row = row.rstrip('\n')
            words.append(row)
            row = words_file.readline()
        words_file.close()

        # shuffles the words in the list
        random.shuffle(words)

        # creates 18 pairs of words in a new list
        the_pairs = list()
        for i in range(18):
            the_pairs.append(Cell(words[i],True))
            the_pairs.append(Cell(words[i],True))

        # shuffles the words in the new list
        random.shuffle(the_pairs)

        return the_pairs

    def create_widgets(self):
        """ Create widgets to display the Memory game """
        # instruction text
        Label(self,
              text = "- The Memory Game -",
              font = ("Helvetica", 12, "bold"),
              ).grid(row = 0, column = 0, columnspan = 7)

        # buttons to show the words
        column = 0
        row = 1
        the_pairs = self.readShuffle()
        for index in range(36):
            temp = Button(self,
                   text = the_pairs[index],
                   width = "7",
                   height = "2",
                   relief = GROOVE,
                   command = lambda x = index: Cell.show_word(the_pairs[x])
                   )
            temp.grid(row = row, column = column, padx = 1, pady = 1)
            column += 1
            the_pairs[index].button = temp
            if column == 6:
                column = 0
                row += 1

        # total tries
        self.label = Label(self)
        Label(self,
              text = "Total tries: 0",
              font = ("Helvetica", 11, "italic")
              ).grid(row = 7, columnspan = 7, pady = 5)

        # a quit button
        Button(self,
               text = "Quit",
               font = ("Helvetica", 10, "bold"),
               width = "25",
               height = "1",
               command = self.quit
               ).grid(row = 8, column = 0, columnspan = 7, pady = 5)

##    def update_tries(self):
##        """ Increase tries count and display new total. """
##        self.tries += 1
##        self.label["text"] = "Total Tries: " + str(self.tries)

    def quit(self):
        """ Ends the memory game """
        global root
        root.destroy()

# main
root = Tk()
root.title("Memory")
root.geometry("365x355")
mem = Memory(root)
root.mainloop()
  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-27T03:39:34+00:00Added an answer on May 27, 2026 at 3:39 am

    The immediate problem is that you’re not calling self.show_word on line 136 in Cell.check.

    def check(self, choice1, choice2):
        """ Checks if the chosen words are a pair """
        tries = 0
        if choice1 == choice2:
            pass
        else:
            self.show_word
    
        tries += 1
    

    (You should also just use != here, instead of having a pass statement in your if clause. Additionally, tries isn’t doing anything here…)

    However, even if you do call it (i.e. self.show_word() instead of self.show_word), you have bigger problems, as you’ll set up an infinite loop if the words are not the same once you do.

    check will call show_word which will then call check, etc, etc.

    What you need to do is reset choice1 and choice2 and their respective buttons inside your else statement in Cell.check.

    However, to do this, you need to have access to the cell objects in question. As it is, you only pass in their text values and whether or not they’re hidden.

    The quick fix is to pass around the cell objects themselves.

    First, though, let’s clean your functions up a bit… You have this:

    def show_word(self):
        """ Shows the word behind the cell """
        if self.hidden == True:
            self.hidden = False
        else:
            self.hidden = True
    
        self.button["text"] = str(self)
    
        if mem.choice1 == None:
            mem.choice1 = [self.word, self.hidden]
        else:
            mem.choice2 = [self.word, self.hidden]
            self.check(mem.choice1, mem.choice2)
    
    def check(self, choice1, choice2):
        """ Checks if the chosen words are a pair """
        tries = 0
        if choice1 == choice2:
            pass
        else:
            self.show_word
    
        tries += 1
    

    This is equivalent to:

    def show_word(self):
        """ Shows the word behind the cell """
        self.hidden = not self.hidden
        self.button["text"] = str(self)
    
        if mem.choice1 is None:
            mem.choice1 = [self.word, self.hidden]
        else:
            mem.choice2 = [self.word, self.hidden]
            self.check(mem.choice1, mem.choice2)
    
    def check(self, choice1, choice2):
        """ Checks if the chosen words are a pair """
        if choice1 != choice2:
            self.show_word() # Infinite recursion!!
    

    Now, let’s pass around the Cell instances themselves, so that we can reset their displayed values.

    def show_word(self):
        """ Shows the word behind the cell """
        self.hidden = not self.hidden
        self.button["text"] = str(self)
    
        if mem.choice1 is None:
            mem.choice1 = self
        else:
            mem.choice2 = self
            self.check(mem.choice1, mem.choice2)
    
    def check(self, choice1, choice2):
        """ Checks if the chosen words are a pair """
        mem.choice1, mem.choice2 = None, None
        if choice1.word != choice2.word:
            for cell in (choice1, choice2):
                cell.hidden = True
                cell.button['text'] = str(cell)
    

    Now, things will work as you intended. However, the second choice will never be displayed if it doesn’t match the first one. (In fact, we could remove the mem.choice2 attribute entirely in this version.)

    So, instead, let’s only reset the two values on the third click, if they don’t match.

    def show_word(self):
        """ Shows the word behind the cell """
        self.hidden = not self.hidden
        self.button["text"] = str(self)
    
        if mem.choice1 is None:
            mem.choice1 = self
        elif mem.choice2 is None:
            mem.choice2 = self
        else:
            choice1, choice2 = mem.choice1, mem.choice2
            mem.choice1, mem.choice2 = self, None
            self.check(choice1, choice2)
    
    def check(self, choice1, choice2):
        """ Checks if the chosen words are a pair """
        if choice1.word != choice2.word:
            for cell in (choice1, choice2):
                cell.hidden = True
                cell.button['text'] = str(cell)
    

    Now, things will behave more or less how you want.

    from tkinter import *
    import random
    
    class Cell:
        def __init__(self, word, hidden=True):
            self.word = word
            self.hidden = hidden
    
        def show_word(self):
            """ Shows the word behind the cell """
            self.hidden = not self.hidden
            self.button["text"] = str(self)
    
            if mem.choice1 is None:
                mem.choice1 = self
            elif mem.choice2 is None:
                mem.choice2 = self
            else:
                choice1, choice2 = mem.choice1, mem.choice2
                mem.choice1, mem.choice2 = self, None
                self.check(choice1, choice2)
    
        def check(self, choice1, choice2):
            """ Checks if the chosen words are a pair """
            if choice1.word != choice2.word:
                for cell in (choice1, choice2):
                    cell.hidden = True
                    cell.button['text'] = str(cell)
    
        def __str__(self):
            """ Displays or hides the word """
            if self.hidden == True:
                return "---"
            else:
                return self.word
    
    class Memory(Frame):
        """ GUI application that creates a Memory game """
        def __init__(self, master):
            super(Memory, self).__init__(master)
            self.grid()
            self.create_widgets()
            self.tries = 0
            self.choice1 = None
            self.choice2 = None
    
        def readShuffle(self):
            """ Creates and organizes (shuffles) the pairs in a list """
            # reads a list of words from the file
            with open('memo.txt', 'r') as infile:
                words = [line.strip() for line in infile]
    
            # creates 18 pairs of words in a new list
            the_pairs = list()
            for i in range(18):
                the_pairs.extend([Cell(words[i]), Cell(words[i])])
    
            # shuffles the words in the new list
            random.shuffle(the_pairs)
    
            return the_pairs
    
        def create_widgets(self):
            """ Create widgets to display the Memory game """
            # instruction text
            Label(self,
                  text = "- The Memory Game -",
                  font = ("Helvetica", 12, "bold"),
                  ).grid(row = 0, column = 0, columnspan = 7)
    
            # buttons to show the words
            column = 0
            row = 1
            the_pairs = self.readShuffle()
            for index in range(36):
                temp = Button(self,
                       text = the_pairs[index],
                       width = "7",
                       height = "2",
                       relief = GROOVE,
                       command = the_pairs[index].show_word
                       )
                temp.grid(row = row, column = column, padx = 1, pady = 1)
                column += 1
                the_pairs[index].button = temp
                if column == 6:
                    column = 0
                    row += 1
    
            # total tries
            self.label = Label(self)
            Label(self,
                  text = "Total tries: 0",
                  font = ("Helvetica", 11, "italic")
                  ).grid(row = 7, columnspan = 7, pady = 5)
    
            # a quit button
            Button(self,
                   text = "Quit",
                   font = ("Helvetica", 10, "bold"),
                   width = "25",
                   height = "1",
                   command = self.quit
                   ).grid(row = 8, column = 0, columnspan = 7, pady = 5)
    
    
        def quit(self):
            """ Ends the memory game """
            global root
            root.destroy()
    
    # main
    root = Tk()
    root.title("Memory")
    root.geometry("365x355")
    mem = Memory(root)
    root.mainloop()
    

    However, there’s still a lot of cleanup and re-factoring that you could do. It would make much more sense to have the Memory class handle checking clicks, etc. Also, have a look at the new readShuffle function. You were reading in the file in an amazingly convoluted way. You should probably read over a few basic examples of file usage in python. It’s much simpler than you think.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I have a French site that I want to parse, but am running into
I want to count how many characters a certain string has in PHP, but
I have a string like this: La Torre Eiffel paragonata all’Everest What PHP function
I have this code: - (void)parser:(NSXMLParser *)parser foundCDATA:(NSData *)CDATABlock { NSString *someString = [[NSString
I want to construct a data frame in an Rcpp function, but when I
I have just tried to save a simple *.rtf file with some websites and
link Im having trouble converting the html entites into html characters, (&# 8217;) i
I have a jquery bug and I've been looking for hours now, I can't
this is what i have right now Drawing an RSS feed into the php,
I want use html5's new tag to play a wav file (currently only supported

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.