Pokemon_SL
Pokemon_SL

Reputation: 327

Python: How to get the use of a mouse click to work?

I cant get the mouse to work in my program. I want to be able to click the bubbles, Ive made a list of numbers that are the answer to the question "Multiples of 2" (dont know if this works). If the user clicks the bubble that contains a number of a multiple of 2 I want the bubble to disappear and a score to go up by one (score hasn't been made due to frustration). And vice versa (If the user clicks the wrong bubble number the score will go down).

The code using python 3.3 -

from tkinter import *
import random 

class MouseClick:

    def MakeChoice ( event ):
        if multiples2 pressed = score + 1
        else score -1

Upvotes: 1

Views: 992

Answers (1)

Babu
Babu

Reputation: 2598

I'm not a Tkinter expert, just tried solving. I tested with Python 2.7, though I reckon it'll run on Python3.

from Tkinter import *
import random


class BubbleFrame:

    def __init__(self, root):
        root.title("Math Bubbles")
        self.bubbles = {}  # this will hold bubbles ids, positions and velocities
        self.score = 0
        Button(root, text="Start", width=8, command=self.initialize_bubbles).pack()  # This button starts the game, making the bubbles move across the screen
        Button(root, text="Quit", width=8, command=quit).pack()
        self.canvas = Canvas(root, width=800, height=650, bg='#afeeee')
        self.canvas.create_text(400, 30, fill="darkblue", font="Times 20 italic bold", text="Click the bubbles that are multiples of two.")
        self.canvas.pack()

    def initialize_bubbles(self):
        for each_no in xrange(1, 21):
            xval = random.randint(5, 765)
            yval = random.randint(5, 615)
            oval_id = self.canvas.create_oval(xval, yval, xval + 30, yval + 30,
                                              fill="#00ffff", outline="#00bfff",
                                              width=5, tags="bubble")
            text_id = self.canvas.create_text(xval + 15, yval + 15, text=each_no, tags="bubble")
            self.canvas.tag_bind("bubble", "<Button-1>", lambda x: self.click(x))
            self.bubbles[oval_id] = (xval, yval, 0, 0, each_no, text_id)  # add bubbles to dictionary

    def click(self, event):
        if self.canvas.find_withtag(CURRENT):
            item_uid = event.widget.find_closest(event.x, event.y)[0]
            is_even = False
            try:  # clicked oval
                self.bubbles[item_uid]
            except KeyError:  # clicked the text
                for key, value in self.bubbles.iteritems():
                    if item_uid == value[5]:  # comparing to text_id
                        if value[4] % 2 == 0:
                            is_even = True
                        self.canvas.delete(key)  # deleting oval
                        self.canvas.delete(item_uid)  # deleting text
            else:
                if self.bubbles[item_uid][4] % 2 == 0:
                    is_even = True
                self.canvas.delete(item_uid)  # deleting oval
                self.canvas.delete(self.bubbles[item_uid][5])  # deleting text
            if is_even:
                self.score += 1
            else:
                self.score -= 1
            print self.score

    def loop(self, root):
        for oval_id, (x, y, dx, dy, each_no, text_id) in self.bubbles.items():
            # update velocities and positions
            dx += random.randint(-1, 1)
            dy += random.randint(-1, 1)
            # dx and dy should not be too large
            dx, dy = max(-5, min(dx, 5)), max(-5, min(dy, 5))
            # bounce off walls
            if not 0 < x < 770:
                dx = -dx
            if not 0 < y < 620:
                dy = -dy
            # apply new velocities
            self.canvas.move(oval_id, dx, dy)
            self.canvas.move(text_id, dx, dy)
            self.bubbles[oval_id] = (x + dx, y + dy, dx, dy, each_no, text_id)
        # have mainloop repeat this after 100 ms
        root.after(100, self.loop, root)

if __name__ == "__main__":
    root = Tk()
    frame = BubbleFrame(root)
    frame.loop(root)
    root.mainloop()

Upvotes: 2

Related Questions