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

2024-03-14

我是 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类型转换我收到此错误:

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 156, in _on_mousewheel
                self.canvas.yview_scroll(-1 * (event.delta / 120), "units")
        File "C:\Users\twaku\Anaconda3\lib\tkinter\__init__.py", line 1745, in yview_scroll
                self.tk.call(self._w, 'yview', 'scroll', number, what)
            _tkinter.TclError: expected integer but got "1.0"

所以现在我在这两个错误之间来回徘徊。

这是我的代码:

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()

除法时,结果是浮点数。尝试使用整数除法:

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

现在,您可能想检查鼠标指针悬停在哪个小部件上,因为_on_mousewheel()当鼠标指针悬停在滚动条上时调用该函数,使其滚动速度加快两倍。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用于在画布上滚动的 Tkinter 鼠标滚轮操作 的相关文章

  • 在 Python 中,部分函数应用(柯里化)与显式函数定义

    在 Python 中 以下方式是否被认为是更好的风格 根据更一般的 可能是内部使用的功能显式定义有用的功能 或者 使用偏函数应用来显式描述函数柯里化 我将通过一个人为的例子来解释我的问题 假设编写一个函数 sort by scoring 它
  • 以 str.format 切片字符串

    我想实现以下目标str format x y 1234 5678 print str x 2 str y 2 我能够做到这一点的唯一方法是 print 0 1 format str x 2 str y 2 现在 这是一个例子 我真正拥有的是
  • Pytorch - 推断线性层 in_features

    我正在构建一个玩具模型来获取一些图像并进行分类 我的模型看起来像 conv2d gt pool gt conv2d gt linear gt linear 我的问题是 当我们创建模型时 我们必须计算第一个线性层的大小in features基
  • 在 Django 中使用 prefetch_lated 连接 ManyToMany 字段

    我可能遗漏了一些明显的东西 但我在连接 ManyToMany 字段以在 Django 应用程序中工作时遇到问题 我有两个模型 class Area models Model name CharField class Role models
  • 在 Python 中同时插入行

    我正在尝试对我的代码进行矢量化 但遇到了障碍 我有 nxd x 值数组 x1 xn 其中每一行 x1 有很多点 x11 x1d nxd y 值数组 y1 y2 y3 其中每一行 y1 有很多点 y11 y1d x 值的 nx1 数组 x 1
  • TCP打孔问题

    我尝试使用 Python 3 中概述的原则为防火墙编写一个基本的 TCP 打孔器本文 http www bford info pub net p2pnat index html 不过 我无法连接任何东西 这是代码 usr bin pytho
  • Python,将字典存储在数据库中

    在数据库中存储和检索 python 字典的最佳方法是什么 如果您对使用传统 SQL 数据库 例如 MySQL 不是特别感兴趣 您可以研究非结构化文档数据库 其中文档自然映射到 python 字典 例如MongoDB http www mon
  • 如果每个区域内至少有 5 个连续行,如何在每个标题区域的末尾使用 Title[Name]2 发布新行?

    我想在每个 Title 区域的末尾使用 Title Name 2 发布新行的最简单方法是通过一个计算连续行数的变量 其中至少有 5 个连续行包含 1 1 1 1在每个 标题区域内 我不确定我对计数变量做错了什么 也许 确实必须在每个 Tit
  • 使用 Matplotlib 的范围绘制图像的 3D 轮廓

    正如我所介绍的here https stackoverflow com questions 18792624 fits image input to a range in plot python 在二维中 我想知道如何 缩放 要绘制到绘图中
  • 使用pip安装pylibmc时出错

    您好 当我尝试使用 pip 在 OSX Lion 上安装 pylibmc 时 出现以下错误 pylibmcmodule h 42 10 fatal error libmemcached memcached h file not found
  • 使用prefersLargeTitles 和 UITableView 平滑滚动

    我在使用时遇到了滚动问题prefersLargeTitles并添加了UITableView 如果我设置prefersLargeTitles在导航控制器中 其根是UITableViewController一切都很好 导航大标题的滚动方式与我们
  • 使用 NumPy 的 Mittag-Leffler 函数的不稳定性

    在尝试重现时Wolfram MathWorld 上的情节 http mathworld wolfram com Mittag LefflerFunction html 并试图帮助这个问题 https stackoverflow com qu
  • 如何使用appium自动化Android手机后退按钮

    我正在使用 Appium python 客户端库 对 Android 上的混合移动应用程序进行测试自动化 我无法找到任何方法来自动化或创建手势以使用 电话后退 按钮返回到应用程序的上一页 有没有可以使用的驱动函数 我尝试了 self dri
  • python - 将cookie添加到cookiejar

    如何在 python 中创建 cookie 并将其添加到 CookieJar 实例 我拥有 cookie 的所有信息 名称 值 域 路径等 但我不想通过 http 请求提取新的 cookie 我尝试了这个 但看起来 SimpleCookie
  • Python itertools groupby 中令人不安的奇怪行为/错误?

    我在用itertools groupby解析一个短的制表符分隔的文本文件 文本文件有几列 我想做的就是对具有特定值的所有条目进行分组x在特定的列中 下面的代码对名为的列执行此操作name2 寻找变量中的值x 我尝试使用以下方法来做到这一点c
  • 如何连接多个字符串? [复制]

    这个问题在这里已经有答案了 如何将 stringList 中的所有字符串合并为一个而不打印它 例如 s joinStrings very hot day returns string print s Veryhotday 感觉有点倒退 但是
  • 如何使用资源模块来衡量函数的运行时间?

    我想使用Python代码测量函数的CPU运行时间和挂钟运行时间 此处建议资源模块 如何以 Python 代码 不是从终端 的形式分别测量函数的 CPU 运行时间和挂钟运行时间 https stackoverflow com q 192046
  • Pandas:按日历周分组,然后绘制真实日期时间的分组条形图

    EDIT 我找到了一个非常好的解决方案并将其发布在下面作为答案 结果将如下所示 您可以为此问题生成一些示例数据 codes list ABCDEFGH dates pd Series pd date range 2013 11 01 201
  • 设置字符串中单词或字符数的限制

    假设我有一个字符串元素列表 wordlist hi what s up home diddle mc doo Oh wise master kakarot hello have a da 我希望列表中的每个元素最多包含 3 个单词或 20
  • float() 参数必须是字符串或数字,而不是“时间戳”

    我无法使 scilearn 与日期时间系列一起工作 找到了这篇文章 但对我没有帮助 Pandas 类型错误 float 参数必须是字符串或数字 https stackoverflow com questions 41256626 panda

随机推荐