简体   繁体   中英

How to keep track if a button has been clicked

I'm making a memory game and I can't figure out how to keep track if a button has been clicked or not. I would like the tiles to change back to the default image if two images does'nt match when clicked but to stay as the new images if they match.

import tkinter as tk
from tkinter import ttk
from tkinter import *
from PIL import Image, ImageTk
import random
import tkinter.font
from tkinter import messagebox
import time



class MemoryBricks:
    def __init__(self, master):     
        frame=Frame(master)
        frame.grid() 
        master.title("Let's play Kitten Memory!")
        master.iconbitmap(r"default.ico")


        self.button1=ttk.Button(root)
        self.button1.grid(row = 0, column = 0)
        self.photo1 = tk.PhotoImage(file="defaultPic.png")
        self.button1.config(image=self.photo1, command=lambda: showImage(1))

        self.button2=ttk.Button(root)
        self.button2.grid(row=0, column=1)
        self.photo2 = tk.PhotoImage(file="defaultPic.png")
        self.button2.config(image=self.photo2, command=lambda: showImage(2))

        self.button3=ttk.Button(root)
        self.button3.grid(row=0, column=2)
        self.photo3 = tk.PhotoImage(file="defaultPic.png")
        self.button3.config(image=self.photo3, command=lambda: showImage(3))

        self.button4=ttk.Button(root)
        self.button4.grid(row=1, column=0)
        self.photo4 = tk.PhotoImage(file="defaultPic.png")
        self.button4.config(image=self.photo4, command=lambda: showImage(4))

        self.button5=ttk.Button(root)
        self.button5.grid(row=1, column=1)
        self.photo5 = tk.PhotoImage(file="defaultPic.png")
        self.button5.config(image=self.photo5, command=lambda: showImage(5))

        self.button6=ttk.Button(root)
        self.button6.grid(row=1, column=2)
        self.photo6 = tk.PhotoImage(file="defaultPic.png")
        self.button6.config(image=self.photo6, command=lambda: showImage(6))


        class showImage(MemoryBricks):
            def __init__(self, master):

                if master == 1:
                    load1 = Image.open('Kittens1.GIF')
                    load1Size = load1.resize((145,145))
                    render1 = ImageTk.PhotoImage (load1Size)           
                    img1 = Label(image=render1)
                    img1.image = render1 
                    img1.grid(row = 0, column = 0)



                if master == 2:
                    load1 = Image.open('Kittens2.GIF')
                    load1Size = load1.resize((145,145))
                    render1 = ImageTk.PhotoImage (load1Size)           
                    img1 = Label(image=render1)
                    img1.image = render1                
                    img1.grid(row=0, column=1)   



                if master == 3:
                    load1 = Image.open('Kittens3.GIF')
                    load1Size = load1.resize((145,145))
                    render1 = ImageTk.PhotoImage (load1Size)           
                    img1 = Label(image=render1)
                    img1.image = render1                 
                    img1.grid(row=0, column=2)  



                if master == 4:
                    load1 = Image.open('Kittens1.GIF')
                    load1Size = load1.resize((145,145))
                    render1 = ImageTk.PhotoImage (load1Size)           
                    img1 = Label(image=render1)
                    img1.image = render1                 
                    img1.grid(row=1, column=0)  



                if master == 5:
                    load1 = Image.open('Kittens2.GIF')
                    load1Size = load1.resize((145,145))
                    render1 = ImageTk.PhotoImage (load1Size)           
                    img1 = Label(image=render1)
                    img1.image = render1                 
                    img1.grid(row=1, column=1)  


                if master == 6:
                    load1 = Image.open('Kittens3.GIF')
                    load1Size = load1.resize((145,145))
                    render1 = ImageTk.PhotoImage (load1Size)           
                    img1 = Label(image=render1)
                    img1.image = render1                 
                    img1.grid(row=1, column=2)

#skapar fönstret
root=Tk()  
start_time = time.time()

#root blir master 
mem=MemoryBricks(root)

root.mainloop()


elapsed_time = time.time() - start_time

print("Your time is", elapsed_time)

I believe that I maybe have to make a new class or maybe a function. Or does anyone have any suggestions on how to do this quite easily?

you can have an auxiliary variable that will behave as a flag.

for example define it as self.flag = False . when button is clicked ,change the value of a variable in True ( self.flag = True ), this is the way you can track whether the button is pressed

for example you want to track if button1 is clicked:

 class MemoryBricks:
      def __init__(self, master):
           # Define "flag variable" for button1
           self.flag_btn1 = False

in function(or part of the code) which will be executed when button1 is clicked change the state of the flag:

 class showImage(MemoryBricks):
      def __init__(self, master):
           if master == 1:
                # Change state of the flag
                self.flag_btn1 = True
                load1 = Image.open('Kittens1.GIF')
                load1Size = load1.resize((145, 145))
                render1 = ImageTk.PhotoImage(load1Size)
                img1 = Label(image=render1)
                img1.image = render1
                img1.grid(row=0, column=0)

now you can check if button1 is clicked:

for example, on some signal/action:

 if self.flag_btn1: # True
      print("button1 was clicked")
 else: # False
      print("button1 wasn't clicked")

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM