首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >滚动条不能在画布上工作

滚动条不能在画布上工作
EN

Stack Overflow用户
提问于 2016-11-27 19:12:20
回答 1查看 2.3K关注 0票数 0

我正在使用tkinter在python中创建一个json编辑器。

通过创建一个Canvas并在其中放置一个Frame,我添加了一个滚动条。

然后,我将Scrollbar命令设置为canvas.yview。

有两件事搞砸了,我不知道为什么。

  1. 当我按下滚动按钮(上下箭头)时,画布不会滚动。
  2. 我现在正在将滚动条打包到窗口(根)上而不是框架上,因为每当我将它打包到框架上时,tkinter应用程序就不会打开,我的计算机风扇开始打开.有人知道这是怎么回事吗?(因此,如果试图运行代码,滚动条是很小的)

这是我的代码:

EDIT>码缩短

代码语言:javascript
运行
复制
import Tkinter as tk
import webbrowser
import os
import bjson as bj

class App:
    def __init__(self, master):
        self.window = master
        self.window.geometry("800x450")
        self.canvas = tk.Canvas(self.window, width=800, height=400)
        self.master = tk.Frame(self.canvas, width=800, height=400)
        self.canvas.pack()
        self.master.place(x=0, y=0)
        scrollbar = tk.Scrollbar(self.window)
        scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
        scrollbar.config(command=self.canvas.yview)

    def init(self):
        master = self.master
        self.frames = {
            "Home": HomeFrame(master)
        }
        self.openFrame = None
        self.loadFrame("Home")

    def loadFrame(self, frame):
        self.openFrame = self.frames[frame]
        self.openFrame.display()

    def setTitle(self, t):
        self.window.title(t)

class Frame:
    def __init__(self, master):
        self.master = master
        self.frame = tk.Frame(master)
        self.frame.grid(row=0, column=0, sticky='news')
        self.init()
        self.frame_create()

    def display(self):
        self.frame.tkraise()    #raises frame to top
        self.frame_load()       #initializes the frame

    def clear(self):
        for widget in self.frame.winfo_children():
            widget.destroy()

    def init(self): pass
    def frame_load(self): pass
    def frame_create(self): pass

class HomeFrame(Frame):
    def frame_create(self):
        p = self.frame
        for i in range(20):
            tk.Label(p, text="This is content... " + str(i)).pack()
            for j in range(2):
                LineBreak(p)

def LineBreak(p):
    tk.Label(p, text="").pack()

root = tk.Tk()
glob = {}
app = App(root)
app.init()
root.mainloop()

它有点长,也有点混乱,但是您应该看看我是如何在__init__ of App中添加滚动条的。

有人知道这是怎么回事吗?怎么解决?

提前感谢!

EN

回答 1

Stack Overflow用户

发布于 2016-11-27 21:33:19

您的代码有很多错误。但是,滚动条不能正常工作的问题与您忽略做的两件事有关:

首先,滚动条和小部件需要双向通信。画布需要被告知关于滚动条,而滚动条需要被告知关于画布。你做的是一个,而不是另一个:

代码语言:javascript
运行
复制
self.canvas.configure(yscrollcommand=scrollbar.set)
scrollbar.configure(command=self.canvas.yview)

其次,您需要配置画布的scrollregion属性。这告诉tkinter您想要查看更大的虚拟画布的哪个部分。通常,这是在画布的<Configure>方法的绑定中完成的,通常您希望将其设置为画布中所有内容的边界框。对于后者,可以将字符串"all"传递给bbox方法:

代码语言:javascript
运行
复制
self.canvas.configure(scrollregion=self.canvas.bbox("all"))

如果您知道要滚动的区域的确切大小,可以简单地将其设置为该值(例如:scrollregion=(0,0,1000,1000)在1000x1000像素的区域内滚动)。

第2点的原因是不能将packgrid同时用于共享同一个父部件的小部件。当你这样做的时候,你会得到你描述的行为。这是因为grid将尝试布局所有的小部件。这可能会导致一些小部件更改大小。pack将注意到一个或多个小部件大小的变化,并尝试重新布局所有的小部件。这可能会导致一些小部件更改大小。grid将注意到一个或多个小部件大小的变化,并尝试重新布局所有的小部件。诸若此类。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40832835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档