【问题标题】:Tkinter Key Binding in Different Regions of Window窗口不同区域的 Tkinter 键绑定
【发布时间】:2019-03-22 20:57:20
【问题描述】:

我正在尝试为 2 名玩家制作井字游戏,因此我需要能够在窗口的某些区域单击鼠标来执行不同的操作。我怎么做?这就是我到目前为止所拥有的。

from tkinter import *
# Creates Window
tk = Tk()
canvas = Canvas(tk, width=600, height=600)
tk.title('Tic Tac Toe')
canvas.pack
# Creates Board
line1 = canvas.create_line(200, 0, 200, 600)
line2 = canvas.create_line(400, 0, 400, 600)
line3 = canvas.create_line(0, 200, 600, 200)
line4 = canvas.create_line(0, 400, 600, 400)

# Creates Functions for Xs being placed on board
def x1(event): 
    canvas.create_line(0, 0, 200, 200)
    canvas.create_line(200, 0, 0, 200)

def x2(event): 
    canvas.create_line(200, 0, 400, 200)
    canvas.create_line(400, 0, 200, 200)

# Creates the buttons to put the Xs on the board when clicked DOESN'T WORK
canvas.pack()
canvas.bind("<Button-1>", x1)
canvas.mainloop()

抱歉,如果我的代码格式错误。倒数第二行是我遇到问题的行。我希望 button-1(鼠标单击)能够执行 x1 和 x2(以及最终的其他功能),具体取决于它所在的窗口区域。请帮忙。

【问题讨论】:

    标签: python tkinter graphics tic-tac-toe 2d-games


    【解决方案1】:

    当函数 x1 被调用以响应鼠标点击时,事件对象具有鼠标点击的 x 和 y 坐标(event.x 和 event.y)。使用它们来检测画布的哪个部分被点击并采取相应的行动。

    【讨论】:

    • 您能否举例说明如何使 x1 在坐标 0、0、200、200 中发生?我很难理解您使用的术语。
    【解决方案2】:

    您可以通过以下方式使用事件坐标来识别用户点击了井字棋棋盘的哪个方格:

    from tkinter import *
    # Creates Window
    tk = Tk()
    
    width = 600
    third = width / 3
    
    canvas = Canvas(tk, width=width, height=width)
    tk.title('Tic Tac Toe')
    canvas.pack
    # Creates Board
    canvas.create_line(third, 0, third, width)
    canvas.create_line(third*2, 0, third*2, width)
    canvas.create_line(0, third, width, third)
    canvas.create_line(0, third*2, width, third*2)
    
    
    def draw_cross(row,col):
        canvas.create_line(col * third, row * third, (col + 1) * third, (row + 1) * third)
        canvas.create_line((col + 1) * third, row * third, col * third, (row + 1) * third)
    
    def mouse_click(event):
        col = int(event.x / third)
        row = int(event.y / third)
        draw_cross(row,col)
    
    canvas.pack()
    canvas.bind("<Button-1>", mouse_click)
    canvas.mainloop()
    

    首先,我使用变量 widththird 参数化了电路板尺寸 - 只需更改 width,一切都会正确调整大小。

    其次,在画布上单击鼠标按钮会调用 mouse_click 事件处理程序,该处理程序获取画布中鼠标被单击的点的坐标(event.x 和 event.x)。 y),并计算井字游戏棋盘上正方形的相应行(0、1 或 2)和列(0、1 或 2)。然后将它们作为参数传递给函数draw_cross,该函数为该正方形绘制两条对角线。

    希望对您有所帮助。

    【讨论】:

    • 这很有帮助,谢谢。如果您也可以帮助我,我对这个链接中的同一个项目还有另一个问题。 link
    • 如果您发现此答案有帮助,您应该对其进行投票和/或将其标记为已接受的解决方案。这就是 stackoverflow 的工作原理。
    猜你喜欢
    • 1970-01-01
    • 2013-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    相关资源
    最近更新 更多