【发布时间】:2019-11-07 18:52:53
【问题描述】:
我有一个功能,它可以帮助我通过左键按下和移动来滚动画布。一切正常。
但是当我添加另一个函数时(假设它是 func B,我不在这里编写 func B 代码,因为它非常大并且需要执行一些依赖项),它使用 exent.x 和y - 执行后它们会自动在上面的函数中执行,结果将我的屏幕拖到画布的开头。我尝试创建另一个函数(已删除函数 B)并在那里使用 event.x 和 y 并遇到了同样的问题。
如果我删除使用event.x 和y 的函数之一,一切正常,但如果我编写使用event.x 和y 的2 个函数,他们会以错误的方式拖动我的屏幕。
如果没有在使用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()
功能说明:
- 'Сenter menu` 是带有画布的框架
-
Grid正在画布上绘制网格。 -
Scroll函数帮助用户通过点击和移动鼠标来拖动画布。 -
create_zone_first_step正在记住弹出窗口出现时用户点击的坐标。 -
create_zone在您左键单击某处时正在创建矩形
看到问题你应该怎么做:
打开窗口并右键单击画布,“添加区域”并单击画布上的某处(无需拖动画布!)。它工作正常并创建矩形(区域)
但是,如果您拖动画布,它会将您移动到“画布的开头”。如果我们将删除
scroll_ functions或create_zone函数,它不会将屏幕“移动到开头”
问题是我需要以这种方式创建矩形,但这种不恰当的屏幕移动让我无法实现我的想法。
对不起,我的“不受欢迎”的解释。
【问题讨论】:
-
我们需要查看minimal reproducible example 才能猜出您的代码出了什么问题。
-
@jasonharper 我编辑了我的问题,请看一下
-
你发布的代码太多了。请尝试将其减少到minimal reproducible example。
-
@BryanOakley 我编辑了我的问题。现在只有代码所需的最小值。请看一下
-
@BryanOakley check event.x in self.canvas.create_rectangle ...它会记住创建矩形后最后点击的位置,下次我尝试滚动画布时,它会将我返回到这个记住的位置。