GUI按钮按下-tkin

2021-06-14 23:16:22 发布

您现在位置:Python中文网/ 问答频道 /正文

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

最新消息:我找到了一个办法让它发挥作用。

3条回答
网友
1楼 ·

基于布莱恩·奥克利的答案,他用旗帜来模拟按下和按住按钮。问题是,在tkinter应用程序中不能有while循环来表示在运行move car forward时

所以我建议用线。这样你就可以在后台运行一个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()
网友
2楼 ·

您可能需要尝试repeatinterval选项。它的工作方式是,只要用户按住按钮,它就会不断地启动。参数repeatinterval实际上让程序知道,如果是,它应该多长时间触发一次按钮。以下是解释的链接:

http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/button.html

在页面中搜索“repeatinterval”。

此参数的另一个名称是repeatdelay

网友
3楼 ·

按下按钮时设置标志,松开按钮时取消设置标志。不需要循环,因为您已经在运行循环(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()

相关问题