Python tkinter event.x执行另一个函数

Python tkinter event.x执行另一个函数,python,tkinter,Python,Tkinter,我有功能,这是帮助我滚动画布的左键按下和移动。一切都很好 但是,当我添加另一个函数时(假设它是funcB,我不会在这里编写funcB代码,因为它非常大,需要执行一些依赖项),它使用exent.x和y-执行后,它们会在上面的func中自动执行,并因此将我的屏幕拖到画布的开头。我试图创建另一个函数(已删除的funcB)并在那里使用event.x和y,但遇到了相同的问题 如果我删除一个使用event.x和y的函数,一切都很好,但是如果我编写两个使用event.x和y的函数,它们会以错误的方式拖动我的屏

我有功能,这是帮助我滚动画布的左键按下和移动。一切都很好

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

如果我删除一个使用
event.x
y
的函数,一切都很好,但是如果我编写两个使用
event.x
y
的函数,它们会以错误的方式拖动我的屏幕

如果不在使用
event.x
y
的其他函数中执行它们,我如何使用
event.x
y

编辑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()
从tkinter导入*
类主(框架):
定义初始化(自,主):
帧。\uuuu初始化(自,主)
self.canvas_width=64000
self.canvas_高度=64000
main.columnconfigure(0,权重=1)
main.rowconfigure(0,权重=1)
#执行所有功能
self.center_菜单()
self.grid(self.canvas)
#右击菜单
self.rmenu=菜单(self.canvas\u frame,tearoff=0,takefocus=0)
self.rmenu.add_命令(label='Create zone',command=self.Create_zone\u第一步)
self.canvas.bind(“,self.popup)
#束缚
self.canvas.bind(“,self.scroll\u start)
self.canvas.bind(“,self.scroll\u move)
self.canvas.bind(“,self.create\u区域)
#init函数的结尾。
def中心菜单(自):
self.canvas_frame=frame(主,浮雕='groove')
self.canvas_frame.pack(侧=左)
self.canvas\u frame.pack\u propagate(True)
self.canvas=canvas(self.canvas_frame,bg='bisque',宽度=750,高度=750,高光厚度=1)
self.canvas.pack()
self.canvas.addtag\u all(“main\u canvas\u tag”)
def弹出窗口(自身、事件):
self.rmenu.tk_弹出窗口(event.x_root+24,event.y_root-14,entry=“0”)
self.coords_1=[event.x,event.y]
def创建区域第一步(自我):
self.from_x=self.coords_1[0]
self.from_y=self.coords_1[1]
#检查
self.FIRST\u COORDS\u CREATED=True
def创建_区域(自身、事件):
如果self.FIRST\u COORDS\u CREATED==True:
self.zone=self.canvas.create_矩形(self.from_x,self.from_y,event.x,event.y)
self.FIRST\u COORDS\u CREATED=False
def网格(自身,画布):
对于范围内的l(0,self.canvas_宽度,10):
canvas.create_line([(l,0),(l,self.canvas_width)],fill='#d9d9d9')
对于范围内的l(0,self.canvas\u高度,10):
canvas.create_line([(0,l),(self.canvas_height,l)],fill='#d9d9d9')
def scroll_启动(自身、事件):
self.canvas.scan_标记(event.x,event.y)
def scroll_移动(自身、事件):
self.canvas.scan_dragto(事件x,事件y,增益=1)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main=Tk()
main.state(“缩放”)#全屏打开窗口
主标题(“我的疯狂仓库”)
#引出类
主要(主要)
main.mainloop()
功能描述:

  • “Сenter menu”是带有画布的框架
  • Grid
    正在画布上绘制网格
  • 滚动
    功能通过单击和移动鼠标帮助用户拖动画布
  • 创建区域\u第一步是记住弹出窗口出现时用户单击的坐标
  • create\u zone
    在左键单击某个位置时正在创建矩形
  • 您应该做些什么来发现问题:

  • 打开窗口,右键单击画布,“添加区域”,然后单击画布上的某个位置(不拖动画布!)。它可以正常工作并创建矩形(区域)

  • 但如果你拖动画布,它会将你移动到“画布的开始”。如果我们删除
    scroll\u功能
    create\u zone
    功能,它将不会将屏幕“移到开头”

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

    很抱歉,我的解释“不受欢迎”。

    问题(或至少部分问题)在于您试图将两个不同的函数绑定到一个事件<代码>
    是同一事件。因此,当您执行
    self.canvas.bind(“,self.create\u 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()
    
    将tkinter作为tk导入
    root=tk.tk()
    def回调1(事件):
    打印(“回调1”)
    def回调2(事件):
    打印(“回调2”)
    root.bind(“,callback1)
    root.bind(“,callback2)
    root.mainloop()
    
    当您运行上述代码并在窗口中单击时,您将看到仅调用了
    callback2

    您不需要尝试进行两个单独的绑定,而需要对一个函数进行一个绑定,该绑定足够智能,可以知道何时应该调用
    scroll\u start
    ,何时应该调用
    create\u zone


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

    我们需要看到一个绑定,以便能够猜测代码中的错误。@jasonharper我编辑了我的问题,请注意您发布的代码太多了。请尽量把它简化成一个问题。@BryanOakley我编辑了我的问题。现在只需要代码的最小值。请坐look@BryanOakley检查self中的event.x。