汇智学堂-python系列小游戏(井字游戏之四)

2.5认识鼠标事件
现在我们要在棋盘上根据鼠标单击的点,来落棋子。首先我们一起认识一下鼠标事件。通过鼠标事件,我们结合坐标,就可以在准确的位置画出棋子。我们利用弹出框来给我做提醒。下面是我们要做的事情。
1、导入messagebox。
2、定义函数。
3、将函数内执行的代码绑定到鼠标事件上。

实现代码如下:

import tkinter.messagebox
def action(event):
tkinter.messagebox.showinfo(‘获取y的坐标’,event.y)

canvas.bind(’’, action)

import tkinter.messagebox,起到的作用是引入messagebox,利用它的showinfo()来显示提醒的内容。
def action(event):定义一个函数,event是一个参数,可以通过它来获得鼠标的坐标。Event.Y是鼠标单击时的纵坐标。
canvas.bind(’’, action):将函数执行的内容,绑定到鼠标事件上。

将代码整合起来,整合后完整代码如下:

#-- coding:GBK --

from tkinter import *
import time

import tkinter.messagebox #messagebox

tk = Tk()
tk.title(“雷雷的井字游戏”)
tk.resizable(0, 0)
tk.wm_attributes("-topmost", 1)
canvas = Canvas(tk, width=800, height=800, bd=0, highlightthickness=0)
canvas.pack()
tk.update()

def action(event):
tkinter.messagebox.showinfo(‘获取y的坐标’,event.y)
canvas.bind(’’, action)
#画棋盘
canvas.create_line(100,100,700,100)
canvas.create_line(100,300,700,300)
canvas.create_line(100,500,700,500)
canvas.create_line(100,700,700,700)

canvas.create_line(100,100,100,700)
canvas.create_line(300,100,300,700)
canvas.create_line(500,100,500,700)
canvas.create_line(700,100,700,700)
‘’’
#落下棋子
canvas.create_oval(100, 100, 300, 300, fill = “green” )
canvas.create_oval(300, 100, 500, 300, fill = “red” )#(x,y,x2,y2)
canvas.create_oval(500, 100, 700, 300, fill = “green” )

canvas.create_oval(100, 300, 300, 500, fill = “red” )
canvas.create_oval(300, 300, 500, 500, fill = “green” )
canvas.create_oval(500, 300, 700, 500, fill = “red” )

canvas.create_oval(100, 500, 300, 700, fill = “green” )
canvas.create_oval(300, 500, 500, 700, fill = “red” )
canvas.create_oval(500, 500, 700, 700, fill = “green” )
‘’’
#提示
#tkinter.messagebox.showinfo(‘提示1’,‘提示2’)

while 1:
tk.update_idletasks()
tk.update()
time.sleep(0.01)

运行这段代码,单击鼠标左键,就会提醒您当前位置的Y坐标。见图2-9
汇智学堂-python系列小游戏(井字游戏之四)
图2-9
2.6通过鼠标,测试交替落不同颜色的棋子
现在我们要在棋盘上交替画棋子。第一次落下的是绿色棋子,第二次落下的是红色棋子。
我们从一个绿色棋子开始。下面是我们要做的事情。
1、画出第一个绿色棋子。位置放在第一个格子内,并且给出提示。
2、画出第二个棋子:红色。位置放在第二个格子内,并且给出提示。

实现代码如下:

redorgreen=0

def action(event):
global redorgreen
if redorgreen==0:
canvas.create_oval(100, 100, 300, 300, fill = “green” )
redorgreen=1
tkinter.messagebox.showinfo(‘提示’,redorgreen)
else:
canvas.create_oval(300, 100, 500, 300, fill = “red” )#(x,y,x2,y2)
tkinter.messagebox.showinfo(‘提示’,event.y)

redorgreen=0,我们定义变量redorgreen,并且给他初值0,通过改变它的值,来改变落子。
global redorgreen,变量前加global,代表是全局的,在不同地方可以改变它的值。

将代码整合起来,整合后完整代码如下:

#-- coding:GBK --

from tkinter import *
import time

import tkinter.messagebox #messagebox

tk = Tk()
tk.title(“雷雷的井字游戏”)
tk.resizable(0, 0)
tk.wm_attributes("-topmost", 1)
canvas = Canvas(tk, width=800, height=800, bd=0, highlightthickness=0)
canvas.pack()
tk.update()

redorgreen=0

#画棋盘
canvas.create_line(100,100,700,100)
canvas.create_line(100,300,700,300)
canvas.create_line(100,500,700,500)
canvas.create_line(100,700,700,700)

canvas.create_line(100,100,100,700)
canvas.create_line(300,100,300,700)
canvas.create_line(500,100,500,700)
canvas.create_line(700,100,700,700)

def action(event):
global redorgreen
if redorgreen==0:
canvas.create_oval(100, 100, 300, 300, fill = “green” )
redorgreen=1
tkinter.messagebox.showinfo(‘提示’,redorgreen)
else:
canvas.create_oval(300, 100, 500, 300, fill = “red” )#(x,y,x2,y2)
tkinter.messagebox.showinfo(‘提示’,event.y)

canvas.bind(’’, action)
‘’’

canvas.create_oval(100, 100, 300, 300, fill = “green” )
canvas.create_oval(300, 100, 500, 300, fill = “red” )#(x,y,x2,y2)
canvas.create_oval(500, 100, 700, 300, fill = “green” )

canvas.create_oval(100, 300, 300, 500, fill = “red” )
canvas.create_oval(300, 300, 500, 500, fill = “green” )
canvas.create_oval(500, 300, 700, 500, fill = “red” )

canvas.create_oval(100, 500, 300, 700, fill = “green” )
canvas.create_oval(300, 500, 500, 700, fill = “red” )
canvas.create_oval(500, 500, 700, 700, fill = “green” )
‘’’
#提示
#tkinter.messagebox.showinfo(‘提示1’,‘提示2’)

while 1:
tk.update_idletasks()
tk.update()
time.sleep(0.01)

运行这段代码,单击鼠标左键两次,不同颜色的棋子就出现在棋盘上了。见图2-10,2-11
汇智学堂-python系列小游戏(井字游戏之四)
图2-10
汇智学堂-python系列小游戏(井字游戏之四)
图2-11