netds 发表于 2020-3-23 19:11:29

tkinter为什么 绑定不成功

本帖最后由 一个账号 于 2020-3-24 11:16 编辑

# 目的是实现左键开始运动,空格暂停,又空格运动。
import tkinter astk
class Ball:
    def __init__(self, canvas, color):
      self.canvas = canvas         # 在类的初始化的函数里面初始化canvas
      self.id = canvas.create_oval(10, 10, 25, 25, fill=color)#画一个实心的球并记录下它的id
      self.canvas.move(self.id, 250, 200)   #创建球的默认在主界面上的位置,把它放在屏幕中间
      self.x = 0                     #默认不水平移动
      self.y = -1                  #默认初始向上移动
      self.started=False             #赋初值False
      self.canvas.bind_all('<Button-1>',self.start)   #绑定鼠标左键
      self.canvas.bind_all('<space>',self.pause)      #绑定空格
      
    def start(self,event):
      self.started=True         #按鼠标就开始

    def pause(self,event):         #按空格就暂停,按空格在开始
      if self.started:
            self.started=False
      else:
            self.started=True
    def draw(self):
      self.canvas.move(self.id, self.x, self.y)               #每次移动的像素
      pos = self.canvas.coords(self.id)                   #获得移动后的坐标(x1,y1,x2,y2)
      if pos <= 0:                     #若到达顶端,就向下
            self.y = 1
      if pos >= 400:         #若到达底部,就向上
            self.y = -1
      self.canvas.after(5, self.draw)      

root =tk.Tk()
root.title("Python game testing")
root.resizable(0, 0)
root.wm_attributes("-topmost", 1)

canvas = tk.Canvas(root, width=500, height=400, bd=0, highlightthickness=0)
canvas.pack()
canvas.update()

ball = Ball(canvas, "red")
if ball.started:         #如果鼠标按下就开始运动
    ball.draw()
root.mainloop()

六小鸭 发表于 2020-3-23 19:31:11

https://ask.csdn.net/questions/1053114
看看是不是

netds 发表于 2020-3-23 19:38:31

不是这个原因。

netds 发表于 2020-3-24 13:20:05

netds 发表于 2020-3-27 09:48:04

{:5_103:}

lixiangyv 发表于 2020-3-28 17:31:22

因为程序时从上往下执行的吗!

执行到   if ball.started:   因为默认是 False ,所以不会执行 if 语句块里的内容。
到了 mainloop 的时候,是不会一直执行 if ball.started: 语句的。

做法就是 把 mainloop 去掉,因为一会儿要写循环,如果是死循环,程序就会执行不到这里,

循环里面就是 去一直执行if ball.started:
还得加上 root.update() 如果不加程序会卡掉。
还得判断窗口是否退出,不判断会出现错误,
只需要捕获异常即可。

最终代码是:
# 目的是实现左键开始运动,空格暂停,又空格运动。
import tkinter astk
class Ball:
    def __init__(self, canvas, color):
      self.canvas = canvas         # 在类的初始化的函数里面初始化canvas
      self.id = canvas.create_oval(10, 10, 25, 25, fill=color)#画一个实心的球并记录下它的id
      self.canvas.move(self.id, 250, 200)   #创建球的默认在主界面上的位置,把它放在屏幕中间
      self.x = 0                     #默认不水平移动
      self.y = -1                  #默认初始向上移动
      self.started=False             #赋初值False
      self.canvas.bind('<Button-1>',self.start)   #绑定鼠标左键
      self.canvas.bind('<space>',self.pause)      #绑定空格
      
    def start(self,event):
      self.started=True         #按鼠标就开始

    def pause(self,event):         #按空格就暂停,按空格在开始
      if self.started:
            self.started=False
      else:
            self.started=True
    def draw(self):
      self.canvas.move(self.id, self.x, self.y)               #每次移动的像素
      pos = self.canvas.coords(self.id)                   #获得移动后的坐标(x1,y1,x2,y2)
      if pos <= 0:                     #若到达顶端,就向下
            self.y = 1
      if pos >= 400:         #若到达底部,就向上
            self.y = -1
      self.canvas.after(5, self.draw)      

root =tk.Tk()
root.title("Python game testing")
root.resizable(0, 0)
root.wm_attributes("-topmost", 1)

canvas = tk.Canvas(root, width=500, height=400, bd=0, highlightthickness=0)
canvas.pack()
canvas.update()

ball = Ball(canvas, "red")

while True:
    try:
      if ball.started:         #如果鼠标按下就开始运动
            ball.draw()
            
      root.update() # 刷新页面,是程序不会未响应
    except Exception:
      break
页: [1]
查看完整版本: tkinter为什么 绑定不成功