我正在尝试在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('<ButtonRelease-1>',stop_motor)
def stop_motor(event):
hold_down= False
print('button released')
button = Button(root, text ="forward")
button.pack(side=LEFT)
root.bind('<Button-1>',button_forward)
root.mainloop()
我正在尝试模拟我在answer
中找到的内容我尝试在带有布尔值的while
循环中进行此操作。当用户按下按钮时,布尔值变为True
,代码进入while循环。当用户释放按钮时,布尔值变为False
并且代码从循环退出,但是在此代码中,无论是否释放按钮,布尔值都保持为真。
编辑:我希望在条件发生之前调用一个函数。要调用的函数是hold_down(),要检查的条件是按钮被释放。
更新:我找到了一种方法让它发挥作用。
答案 0 :(得分:6)
按下按钮时设置标志,释放按钮时取消设置标志。因为您已经在运行循环(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('<ButtonPress-1>',start_motor)
button.bind('<ButtonRelease-1>',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('<ButtonPress-1>', lambda event, direction=direction: start_motor(direction))
button.bind('<ButtonRelease-1>', lambda event: stop_motor())
root.mainloop()
答案 1 :(得分:1)
您可能想尝试repeatinterval
选项。它的工作方式是只要用户按下按钮,按钮就会持续闪烁。 repeatinterval
参数基本上允许程序知道它应该触发按钮的频率(如果是这样)。以下是解释的链接:
http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/button.html
在页面内搜索&#34; repeatinterval&#34;。
此参数的另一个名称是repeatdelay
。
答案 2 :(得分:1)
以Bryan Oakley的答案为基础,使用标志模拟按住按钮。问题是你的tkinter应用程序中没有任何while循环在运行前进汽车时说。
这就是我建议使用线程的原因。这样你就可以在后台运行一个while循环,检查汽车是否应该向前移动。
from threading import Thread
from Tkinter import *
running = False
root = Tk()
def start_motor(event):
global running
print("starting motor...")
running = True
def stop_motor(event):
global running
running = False
print("stopping motor...")
def move_forward():
while True: # Thread will run infinitely in the background
if running:
print("Car is moving forward...\n")
button = Button(root, text ="forward")
button.pack(side=LEFT)
button.bind('<ButtonPress-1>',start_motor)
button.bind('<ButtonRelease-1>',stop_motor)
# Create and start the new thread
t = Thread(target = move_forward, args = ())
t.start()
root.mainloop()
答案 3 :(得分:0)
试试这个......
from Tkinter import *
root = Tk()
global hold_down
def button_hold(event):
hold_down = True
while hold_down:
print('test statement')
def stop_motor(event):
hold_down = False
print('button released')
button = Button(root, text ="forward")
button.pack(side=LEFT)
root.bind('<Button-1>',button_hold)
root.bind('<ButtonRelease-1>',stop_motor)
root.mainloop()
答案 4 :(得分:-1)
@ Danny尝试以下代码:
def stop_motor(event): 打印(&#39;按钮已发布&#39;) 返回False
这个答案运行print&#39;测试声明&#39;一度。按下按钮时,while循环运行一次。
@ Bryan Oakley按下按钮时设置标志,释放按钮时取消设置标志。由于您已经在运行循环(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)
root.bind('<ButtonPress-1>',start_motor)
root.bind('<ButtonRelease-1>',stop_motor)
root.mainloop()
按下按钮时,上面的答案会保持无限循环。
@ Joseph Farah您可能想尝试repeatinterval选项。它的工作方式是只要用户按下按钮,按钮就会持续闪烁。 repeatinterval参数基本上让程序知道它应该多长时间触发按钮。以下是解释的链接:
http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/button.html
在页面内搜索&#34; repeatinterval&#34;。
此参数的另一个名称是repeatdelay。
我在按钮小部件的参数选项中设置了重复间隔,但它没有重复该命令。
感谢所有答案。仍在寻求解决这个问题。