在画布上滚动的Tkinter鼠标滚轮操作

2024-05-23 14:39:21 发布

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

我是python新手,在画布上添加鼠标滚动操作时遇到了一个问题滚动条当我手动滚动滚动条时,滚动条工作得很好,或者鼠标在它上面滚动鼠标滚轮。我的问题是,我希望能够滚动我的鼠标滚轮在我的画布上,甚至只是我的框架,让它里面的内容滚动,只要我的鼠标悬停在它上面。 我花了好几个小时在stackoverflow上研究了与此相关的所有类似问题,但我的修改似乎都不起作用。我现在得到一个奇怪的错误,我无法纠正。由于我的修改,错误只在我开始滚动时出现,但是它不会导致撞车。那个错误为:-

            Exception in Tkinter callback
            Traceback (most recent call last):
              File "C:\Users\twaku\Anaconda3\lib\tkinter\__init__.py", line 1699, in __call__
                return self.func(*args)
              File "C:/Users/twaku/PycharmProjects/DCSui/FileToSubmit.py", line 152, in _on_mousewheel
                self.canvas.yview_scroll(int(-1 * (event.delta / 120), "units"))
            TypeError: 'str' object cannot be interpreted as an integer

现在如果我去掉“int”类型,我会得到这个错误:-在

^{pr2}$

所以现在我只能在两个错误之间来回走动。在

这是我的代码:

            from tkinter import *
            import tkinter as tk
            import time
            import xlrd


            root = Tk()


            root.state('zoomed')  # full screen -windowed

            # ------------------INTRODUCTION BLOCK--------------
            f1 = Frame(root, width=900, height=700, relief=SUNKEN)
            f1.grid_rowconfigure(1, weight=1)
            f1.grid_columnconfigure(2, weight=1)
            f1.pack(fill=BOTH, expand=1, side=BOTTOM)

            root.title("Diagram Scroll Test")

            Tops = Frame(root, width=1600, height=50, relief=SUNKEN)
            Tops.pack(side=TOP)

            # ------------------TIME--------------
            localtime = time.asctime(time.localtime(time.time()))
            # -----------------INFO TOP------------
            lblinfo = Label(Tops, font=('aria', 30, 'bold'), text="My Diagram Scroll Test",
                            fg="steel blue", bd=10, anchor='w')
            lblinfo.grid(row=0, column=0)
            lblinfo = Label(Tops, font=('aria', 20,), text=localtime, fg="steel blue", anchor=W)
            lblinfo.grid(row=1, column=0)
            lblinfo = Label(Tops, font=('aria', 15, 'bold'), text="Please help", fg="steel blue", bd=10,
                            anchor='w')
            lblinfo.grid(row=2, column=0)

            # ------------------CANVAS DEFINITION-------------

            class CanvasDemo(Frame):


                def __init__(self,root):
                    Frame.__init__(self,root)


                    self.canvas = tk.Canvas(root, borderwidth=0)
                    self.canvas.bind_all("<MouseWheel>", self._on_mousewheel)
                    self.frame = tk.Frame(self.canvas)
                    self.vsb = tk.Scrollbar(root, orient="vertical", command=self.canvas.yview)
                    self.canvas.configure(yscrollcommand=self.vsb.set)
                    root.state('zoomed')
                    self.vsb.pack(side="right", fill="y")
                    self.canvas.config(width=root.winfo_screenwidth(), height=root.winfo_screenheight())
                    # self.canvas.pack(side="left", fill="both", expand="1")
                    self.canvas.pack(fill="both", expand="1")
                    self.canvas.create_window((4, 4), window=self.frame, anchor="nw",
                                              tags="self.frame")

                    self.frame.bind("<Configure>", self.onFrameConfigure)

                    self.populate()

                # ------------------CODE TO CREATE BLOCK DIAGRAMS-------------

                def populate(self):


                    i = 0
                    turnCount = 0  # Keeps track of how many boxes is used to trigger a turn

                    # Create Small starter box
                    lineVarx1 = 70
                    lineVary1 = 50
                    lineVarx2 = 120
                    lineVary2 = 50

                    varx1 = 120
                    vary1 = 25
                    varx2 = 220
                    vary2 = 75

                    varblk = 1
                    varline = 1

                    self.canvas.create_rectangle(20, 40, 70, 60, fill="green", tags="start")



                    while i < 200:  # Provides 104 blocks

                        # ------------------IF STATEMENT TO CONTROL WHEN DIAGRAM TURNS-------------

                        if turnCount == 12:  # At Turn Point, initiating turn sequence
                            lineVarx2 = lineVarx2 - 25
                            self.canvas.create_line(lineVarx1, lineVary1, lineVarx2, lineVary2, arrow="last", tags="to_r1")
                            # Downward line
                            lineVarx1 = lineVarx2
                            lineVary1 = lineVary2
                            lineVary2 = lineVary2 + 50
                            self.canvas.create_line(lineVarx1, lineVary1, lineVarx2, lineVary2, arrow="last", tags="to_r1")

                            # long line to left
                            lineVarx1 = lineVarx2
                            lineVary1 = lineVary2
                            lineVarx2 = lineVarx2 - 1825
                            self.canvas.create_line(lineVarx1, lineVary1, lineVarx2, lineVary2, arrow="last", tags="to_r1")

                            # Downward line
                            lineVarx1 = lineVarx2
                            lineVary1 = lineVary2
                            lineVary2 = lineVary2 + 50
                            self.canvas.create_line(lineVarx1, lineVary1, lineVarx2, lineVary2, arrow="last", tags="to_r1")

                            lineVary1 = lineVary2
                            lineVarx2 = lineVarx2 + 50

                            varx1 = lineVarx2
                            vary1 = lineVary2 - 25
                            varx2 = lineVarx2 + 100
                            vary2 = lineVary2 + 25
                            turnCount = 0

                        self.canvas.create_line(lineVarx1, lineVary1, lineVarx2, lineVary2, arrow="last", tags="to_r1")
                        self.canvas.create_rectangle(varx1, vary1, varx2, vary2, fill="bisque", tags="r1")
                        self.canvas.create_text(varx1 + 20, vary1, fill="darkblue", anchor=NW,
                                                text="Hi")
                        self.canvas.create_text(varx1 + 20, vary1 + 10, fill="darkblue", anchor=NW,
                                                text="bye")
                        self.canvas.create_text(varx1 + 20, vary1 + 20, fill="darkblue", anchor=NW,
                                                text="fly")
                        lineVarx1 = lineVarx1 + 150
                        lineVarx2 = lineVarx2 + 150
                        varx1 = varx1 + 150
                        varx2 = varx2 + 150
                        i += 1
                        turnCount += 1

                    # "End" Block
                    lineVarx1 = varx2 - 150
                    lineVarx2 = lineVarx1 + 50

                    varx1 = lineVarx2
                    vary1 = lineVary1 - 10
                    varx2 = varx1 + 50
                    vary2 = lineVary1 + 10

                    self.canvas.create_line(lineVarx1, lineVary1, lineVarx2, lineVary2, arrow="last", tags="to_r1")
                    self.canvas.create_rectangle(varx1, vary1, varx2, vary2, fill="red", tags="r1")






                def _on_mousewheel(self, event):
                        self.canvas.yview_scroll(-1 * (event.delta / 120), "units")



                def onFrameConfigure(self, event):
                    '''Reset the scroll region to encompass the inner frame'''
                    self.canvas.configure(scrollregion=self.canvas.bbox("all"))



            def qexit():
                root.destroy()


            btnexit = Button(f1, padx=16, pady=7, bd=10, fg="black", font=('ariel', 12, 'bold'), width=8, text="EXIT",
                             bg="powder blue", command=qexit)
            btnexit.grid(row=15, column=2)





            canvas = CanvasDemo(root)
            canvas.pack()

            mainloop()

Tags: totextselfcreatelinetagsrootfill
1条回答
网友
1楼 · 发布于 2024-05-23 14:39:21

当你除以结果是一个浮点数。请尝试使用整数除法:

def _on_mousewheel(self, event):
    self.canvas.yview_scroll(-1 * (event.delta // 120), "units")
                                        here: ^

现在,您可能需要检查鼠标指针悬停在哪个窗口小部件上,因为当鼠标指针悬停在滚动条上时,_on_mousewheel()函数会被调用,使其滚动速度提高两倍。在

相关问题 更多 >