我正在尝试用python中的GUI来控制我的机器人汽车.我的问题是我如何做一个确定按下按钮的功能.我想在按下按钮时移动汽车,并在释放按钮时停止汽车.
from Tkinter import * hold_down = False root = Tk() def button_hold(event): hold_down=true while hold_down== True: print('test statement') hold_down = root.bind('',stop_motor) def stop_motor(event): hold_down= False print('button released') button = Button(root, text ="forward") button.pack(side=LEFT) root.bind(' ',button_forward) root.mainloop()
我试图模拟我在这个答案中找到的东西
我尝试在while
一个布尔循环中做到这一点.当用户按下按钮时,布尔值变为True
,代码进入while循环.当用户释放按钮时,布尔值会更改为,False
并且代码将从循环中退出,但在此代码中,无论是否释放按钮,布尔值始终为true.
编辑:我希望在条件发生之前调用函数.要调用的函数是hold_down(),要检查的条件是按钮被释放.
更新:我找到了一种方法让它工作.
按下按钮时设置标志,释放按钮时取消设置标志.因为你已经在运行一个循环,所以不需要循环(mainloop
)
from Tkinter import * running = False root = Tk() def start_motor(event): global running running = True print("starting motor...") def stop_motor(event): global running print("stopping motor...") running = False button = Button(root, text ="forward") button.pack(side=LEFT) button.bind('',start_motor) button.bind(' ',stop_motor) root.mainloop()
假设您在按下按键时确实想要执行某些操作,可以使用设置动画循环after
.例如,要在按下按钮时每秒调用一次print语句,您可以添加一个执行print语句的函数,然后安排自己在一秒后调用.停止按钮只需要取消任何待处理的作业.
这是一个例子.与原始代码的主要区别在于添加了一个move
函数.我还添加了第二个按钮,以显示如何使用相同的功能前进或后退.
from Tkinter import * running = False root = Tk() jobid = None def start_motor(direction): print("starting motor...(%s)" % direction) move(direction) def stop_motor(): global jobid root.after_cancel(jobid) print("stopping motor...") def move(direction): global jobid print("Moving (%s)" % direction) jobid = root.after(1000, move, direction) for direction in ("forward", "backward"): button = Button(root, text=direction) button.pack(side=LEFT) button.bind('', lambda event, direction=direction: start_motor(direction)) button.bind(' ', lambda event: stop_motor()) root.mainloop()