GUI按钮按住 - tkinter

时间:2015-12-30 02:20:46

标签: python tkinter robotics

我正在尝试在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(),要检查的条件是按钮被释放。

更新:我找到了一种方法让它发挥作用。

5 个答案:

答案 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。

我在按钮小部件的参数选项中设置了重复间隔,但它没有重复该命令。

感谢所有答案。仍在寻求解决这个问题。