【问题标题】:How to get mouse coordinates as a variable?如何获取鼠标坐标作为变量?
【发布时间】:2020-06-11 20:10:20
【问题描述】:
import tkinter as tk


field = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]


class Game:
    def click_coordinates(event):
        x = str(event.x)
        y = str(event.y)
        print(x, y)

    root = tk.Tk()
    root.title("Tic Tac Toe")
    root.geometry("304x304")
    my_canvas = tk.Canvas(root, width=300, height=300, background="black")
    my_canvas.grid(row=0, column=0)
    my_canvas.create_line(100, 0, 100, 305, fill="white", width=3)
    my_canvas.create_line(200, 0, 200, 305, fill="white", width=3)
    my_canvas.create_line(0, 100, 305, 100, fill="white", width=3)
    my_canvas.create_line(0, 200, 305, 200, fill="white", width=3)
    my_canvas.bind("<Button-1>", click_coordinates)

    root.mainloop()


if __name__ == "__main__":
    game = Game()

我的问题是我想将鼠标坐标作为变量返回。 我试着写:

def click_coordinates(event):
    x = str(event.x)
    y = str(event.y)
    mouse = x + ":" + y
    return mouse

但我不知道如何使用其他函数访问此变量。如果我想从 click_coordinates() 函数调用另一个函数,我会收到一个错误,即我要调用的新函数的名称未定义。好像只能打印坐标了。

【问题讨论】:

  • 您是否尝试将它们作为属性保存在您的班级中?
  • 退货?将它们归还在哪里?您不能从回调中返回值。或者更准确地说,您可以返回一些内容,但运行回调的代码在大多数情况下会忽略返回的内容。
  • 您需要使您的回调函数click_coordinates() 将信息存储在您的应用程序的其余部分可以访问的某个位置,例如某种类型的列表或某种其他类型的容器对象。

标签: python oop tkinter


【解决方案1】:

如果要访问回调之外的值,则必须设置全局变量或实例变量。由于您正在使用一个类(尽管使用不正确1),实例变量是自然的选择:

例子:

def click_coordinates(self, event):
    self.last_x = event.x
    self.last_y = event.y

然后您可以在对象中的任何其他位置引用self.last_xself.last_y。在类的__init__ 中将这些初始化为None 是个好主意:

class Game:
    def __init__(self):
        self.last_x = self.last_y = None
        ...

1 您应该将所有代码移到__init__ 内,而不是直接移到class Game 下。此外,click_coordinates 需要一个 self 参数,并且应该引用为 self.click_coordinates

class Game:
    def __init__(self):
        root = tk.Tk()
        ...
        my_canvas.bind("<Button-1>", self.click_coordinates)

    def click_coordinates(self, event):
        ...

【讨论】:

  • 感谢您的帮助。我将代码移到 init 下,它现在可以工作了。这是我第一次使用类。
【解决方案2】:

我只是想建议你最好用按钮替换画布,我相信这会更容易,因为按钮有命令,你最好这样做:

`b1=Button(win,font=("Arial Bold", 
50),width=3,bg='white',fg='SteelBlue',command=add1)
lst
b1.grid(row=2,column=1)
b2=Button(win,font=("Arial Bold", 50),width=3,bg='white',fg='SteelBlue',command=add2)
lst
b2.grid(row=2,column=2)
b3=Button(win,font=("Arial Bold", 50),width=3,bg='white',fg='SteelBlue',command=add3)
lst
b3.grid(row=2,column=3)
b4=Button(win,font=("Arial Bold", 50),width=3,bg='white',fg='SteelBlue',command=add4)
lst
b4.grid(row=3,column=1)
b5=Button(win,font=("Arial Bold", 50),width=3,bg='white',fg='SteelBlue',command=add5)
lst
b5.grid(row=3,column=2)
b6=Button(win,font=("Arial Bold", 50),width=3,bg='white',fg='SteelBlue',command=add6)
lst
b6.grid(row=3,column=3)
b7=Button(win,font=("Arial Bold", 50),width=3,bg='white',fg='SteelBlue',command=add7)
lst
b7.grid(row=4,column=1)
b8=Button(win,font=("Arial Bold", 50),width=3,bg='white',fg='SteelBlue',command=add8)
lst
b8.grid(row=4,column=2)
b9=Button(win,font=("Arial Bold", 50),width=3,bg='white',fg='SteelBlue',command=add9)
lst
b9.grid(row=4,column=3)`

然后定义 9 个函数,如果你想与计算机或其他玩家对战(不好,因为它很容易),如果你想变得健壮,只需围绕这段代码玩 -_- 。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 2013-12-26
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多