用于鼠标按键的DownPress的Tkinter事件(按住)?

时间:2017-09-14 20:20:06

标签: python events tkinter python-3.6

更新:此接缝是版本问题。对于python 3.6.1的点击事件不会触发,但是到目前为止我已经测试过2.7。

更新:布莱恩的回答确实解决了我的问题,但是事件没有正常工作,但是在我的3.6.1版本的python上,没有触发点击的事件的问题仍然是一个问题。

Python版本= 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)]

我正在尝试编写一个事件处理程序,以便在按住鼠标按钮时重复执行某些操作。我一直在搜索文档和互联网,但我找不到任何仅按住鼠标左键的参考。

是否有专门用于按住鼠标左键的事件?有一个偶数用于释放<ButtonRelease-1>但是没有一个用于点击和保持事件的接缝。

我已尝试过<Button-1>及其所有同义事件,以防万一,但没有运气。该事件仅在发布时触发,但不会在我想要的情况下触发。我甚至不需要一个持续按住按钮的事件,我只需要一个偶数按下按钮。

欢迎文档,因为我无法找到任何文件。

更新:

这是一个示例代码。它仅在释放按钮时打印。请记住,我正在尝试按滚动条上的箭头按钮并更改滚动速度。

滚动条手柄按滚动箭头的方式与按钮不同吗?

import tkinter as tk


root = tk.Tk()

textbox = tk.Text(root, height = 10)
textbox.grid(row=0, column=0)

scrolling = False
yscroll = tk.Scrollbar(root, command=textbox.yview,orient="vertical", repeatinterval=10, repeatdelay=30)
textbox.configure(yscrollcommand = yscroll.set)
yscroll.grid(row=0, column=1, sticky="ns")

for i in range(1000):
    textbox.insert(tk.END, "{}\n".format(i))

def scrolling_active(arrow):
    global scrolling
    root.bind('<ButtonRelease-1>', stop_scrolling())
    print(arrow)
    if scrolling == True:
        if arrow == "arrow1":
            textbox.tk.call(textbox._w,'yview', 'scroll', -100, 'units')
        if arrow == "arrow2":
            textbox.tk.call(textbox._w,'yview', 'scroll', 100, 'units')
        root.after(100, lambda a = arrow: scrolling_active(a))

def start_scrolling(event):
    global scrolling
    scrolling = True
    scrolling_active(yscroll.identify(event.x, event.y))

def stop_scrolling():
    global scrolling
    scrolling = False

yscroll.bind("<Button-1>", start_scrolling)

root.mainloop()

3 个答案:

答案 0 :(得分:1)

没有按下按钮的事件。只有按下和释放按钮的事件。

如果您需要在按钮关闭时进行跟踪,可以在印刷机上设置标记并在版本上取消设置。

在您的代码中,您有一个错误。请考虑以下代码:

MySQL

它在功能上与此相同:

NetezzaSQL

要进行绑定,您必须删除root.bind('<ButtonRelease-1>', stop_scrolling())

result=stop_scrolling()
root.bind('<ButtonRelease-1>`, None)

您还需要()来接受事件对象:

root.bind('<ButtonRelease-1>', stop_scrolling)

此外,无需致电stop_scrolling。您可以在tkinter对象(def stop_scrolling(event): global scrolling scrolling = False

上调用textbox.tk.call方法

答案 1 :(得分:1)

我知道有点晚了,但是我想做完全一样的事情(将图像拖到画布中以创建操纵杆控制器^^)。

阅读文档http://effbot.org/tkinterbook/tkinter-events-and-bindings.htm时发现了此事件:'<B1-Motion>'

这是我所做的工作示例:

from tkinter import *

root = Tk()
root.geometry('800x600')

image1 = PhotoImage(file = 'images/button.png')
x_img,y_img = 250,250

canvas = Canvas(root, width = 500, height = 400, bg = 'white')
canvas.pack()
imageFinal = canvas.create_image(x_img, y_img, image = image1)

def move(event):
    global x_img,y_img
    x, y = event.x, event.y
    print('{}, {}'.format(x, y))
    canvas.move(imageFinal, x-x_img,y-y_img)
    x_img = x
    y_img = y
    canvas.update()

canvas.bind('<B1-Motion>', move)

root.mainloop()

答案 2 :(得分:0)

您应该能够在最初点击鼠标时绑定到<ButtonPress-1>,然后调用重复功能,直到<ButtonRelease-1>停止它,如您所述。