【问题标题】:tkinter event.x executes another functiontkinter event.x 执行另一个函数
【发布时间】:2019-11-07 18:52:53
【问题描述】:

我有一个功能,它可以帮助我通过左键按下和移动来滚动画布。一切正常。

但是当我添加另一个函数时(假设它是 func B,我不在这里编写 func B 代码,因为它非常大并且需要执行一些依赖项),它使用 exent.xy - 执行后它们会自动在上面的函数中执行,结果将我的屏幕拖到画布的开头。我尝试创建另一个函数(已删除函数 B)并在那里使用 event.xy 并遇到了同样的问题。

如果我删除使用event.xy 的函数之一,一切正常,但如果我编写使用event.xy 的2 个函数,他们会以错误的方式拖动我的屏幕。

如果没有在使用event.xy 的其他函数中执行它们,我怎么能使用event.xy

编辑 2:

*添加最小代码

    from tkinter import *

class Main(Frame):
    def __init__(self, main):
        Frame.__init__(self, main)
        self.canvas_width = 64000
        self.canvas_height = 64000
        main.columnconfigure(0, weight=1)
        main.rowconfigure(0, weight=1)

        # Execute all functions
        self.center_menu()
        self.grid(self.canvas)

        # Right click menu
        self.rmenu = Menu(self.canvas_frame, tearoff=0, takefocus=0)
        self.rmenu.add_command(label='Create zone', command=self.create_zone_first_step)
        self.canvas.bind("<ButtonPress-3>", self.popup)

        # Bind
        self.canvas.bind("<ButtonPress-1>", self.scroll_start)
        self.canvas.bind("<B1-Motion>", self.scroll_move)
        self.canvas.bind("<Button-1>", self.create_zone)
    # End of init function.

    def center_menu(self):
        self.canvas_frame = Frame(main, relief='groove')
        self.canvas_frame.pack(side=LEFT)
        self.canvas_frame.pack_propagate(True)
        self.canvas = Canvas(self.canvas_frame, bg='bisque', width=750, height=750,highlightthickness=1)
        self.canvas.pack()
        self.canvas.addtag_all("main_canvas_tag")

    def popup(self, event):
        self.rmenu.tk_popup(event.x_root + 24, event.y_root - 14, entry="0")
        self.coords_1 = [event.x, event.y]


    def create_zone_first_step(self):
        self.from_x = self.coords_1[0]
        self.from_y = self.coords_1[1]
        # for checking
        self.FIRST_COORDS_CREATED = True


    def create_zone(self, event):
        if self.FIRST_COORDS_CREATED == True:
            self.zone = self.canvas.create_rectangle(self.from_x, self.from_y, event.x, event.y)
            self.FIRST_COORDS_CREATED = False

    def grid(self, canvas):
        for l in range(0, self.canvas_width, 10):
            canvas.create_line([(l, 0), (l, self.canvas_width)], fill='#d9d9d9')
        for l in range(0, self.canvas_height, 10):
            canvas.create_line([(0, l), (self.canvas_height, l)], fill='#d9d9d9')

    def scroll_start(self, event):
        self.canvas.scan_mark(event.x, event.y)

    def scroll_move(self, event):
        self.canvas.scan_dragto(event.x, event.y, gain=1)


if __name__ == '__main__':
    main = Tk()
    main.state('zoomed') # open window in full screen
    main.title('My insane warehouse')
    # Eliciting classes
    Main(main)
    main.mainloop()

功能说明:

  1. 'Сenter menu` 是带有画布的框架
  2. Grid 正在画布上绘制网格。
  3. Scroll 函数帮助用户通过点击和移动鼠标来拖动画布。
  4. create_zone_first_step 正在记住弹出窗口出现时用户点击的坐标。
  5. create_zone 在您左键单击某处时正在创建矩形

看到问题你应该怎么做:

  1. 打开窗口并右键单击画布,“添加区域”并单击画布上的某处(无需拖动画布!)。它工作正常并创建矩形(区域)

  2. 但是,如果您拖动画布,它会将您移动到“画布的开头”。如果我们将删除 scroll_ functionscreate_zone 函数,它不会将屏幕“移动到开头”

问题是我需要以这种方式创建矩形,但这种不恰当的屏幕移动让我无法实现我的想法。

对不起,我的“不受欢迎”的解释。

【问题讨论】:

  • 我们需要查看minimal reproducible example 才能猜出您的代码出了什么问题。
  • @jasonharper 我编辑了我的问题,请看一下
  • 你发布的代码太多了。请尝试将其减少到minimal reproducible example
  • @BryanOakley 我编辑了我的问题。现在只有代码所需的最小值。请看一下
  • @BryanOakley check event.x in self.canvas.create_rectangle ...它会记住创建矩形后最后点击的位置,下次我尝试滚动画布时,它会将我返回到这个记住的位置。

标签: python tkinter


【解决方案1】:

问题(或至少部分问题)是您试图将两个不同的函数绑定到一个事件。 &lt;ButtonPress-1&gt;&lt;Button-1&gt; 是同一个事件。因此,当您执行 self.canvas.bind("&lt;Button-1&gt;", self.create_zone) 时,会删除原始绑定并用新绑定替换它。

这可以通过以下代码轻松演示:

import tkinter as tk
root = tk.Tk()
def callback1(event):
    print("callback 1")
def callback2(event):
    print("callback 2")
root.bind("<ButtonPress-1>", callback1)
root.bind("<Button-1>", callback2)
root.mainloop()

当您运行上述代码并在窗口中四处点击时,您会看到只有 callback2 被调用过。

您需要将一个绑定到一个足够聪明的函数,以知道何时应该调用scroll_start 以及何时应该调用create_zone,而不是尝试进行两个单独的绑定。

另一种解决方案是在您处于“创建区域”模式时临时分配一个绑定,然后恢复为“滚动开始”绑定。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多