【问题标题】:Horizontal Scrollbar not working in Python TKinter Frame水平滚动条在 Python TKinter 框架中不起作用
【发布时间】:2013-07-17 02:15:52
【问题描述】:

我有一个画布(ttk.Frame 没有 xview,yview 方法)在其中保存框架,我想水平浏览它们,因为它们在同一行中。找到了一些教程,当他们处理不同的小部件组合时,我遵循了它们,并尝试将它们应用于我的问题,但没有成功。我确实看到了一个滚动条,但它没有执行任何操作或响应任何内容。

class App:
    def __init__(self,db):
        self.db = db
        self.root = tkinter.Tk()                             
        self.masterframe = ttk.Frame(self.root)
        self.masterframe.grid()

        self.mastercanvas = tkinter.Canvas(self.masterframe)
        self.mastercanvas.grid()

        self.scrollbar = ttk.Scrollbar(self.masterframe,orient="horizontal",
            command = self.mastercanvas.xview)

        self.scrollbar.grid()
        self.mastercanvas.configure(xscrollcommand=self.scrollbar.set)

        for i,e in enumerate(self.db.elements):
            xf = XFrame(self,e)
            xf.grid(row=0,column=i,sticky="n")

编辑:

class XFrame:
    def __init__(self,app,x):
        self.app = app
        self.x = x
        self.frame = ttk.Frame(self.app.mastercanvas)
        self.set_up() # this sets frame's padding and populates it with widgets   

现在,我建议在这里粘贴两行代码* - 在第一个 init 定义的末尾,或在第二个 init 定义的末尾 -没有新的事情发生。我看到我的框架按照我的意图出现 - 其中 3 个。第4部分。和一个不起作用的滚动条。

*

self.update_idletasks() # using self.root in first, self.app.root in second variant
self.mastercanvas.configure(scrollregion=self.mastercanvas.bbox("all")) 
# in second variant reffered to as self.app.mastercanvas ...

【问题讨论】:

    标签: python canvas tkinter scrollbar


    【解决方案1】:

    您必须配置画布的scrollregion 属性,以便它知道您要滚动多少虚拟画布。应该这样做:

    # create everything that will be inside the canvas
    ...
    
    # next, cause the window to be drawn, so the frame will auto-size
    self.update_idletasks() 
    
    # now, tell the canvas to scroll everything that is inside it
    self.mastercanvas.configure(scrollregion=self.mastercanvas.bbox("all"))
    

    话虽如此,您的画布中没有可滚动的内容,而且我不完全确定您期望画布中的内容。如果您想滚动浏览XFrame 的实例,它们需要是其他框架的子级,并且其他框架需要是画布上的对象。

    【讨论】:

    • 哪个对象应该调用update_idletasks?同时 - 随后是 scrollregion 配置 - 我尝试从(会话中的一个)root、masterframe、mastercanvas 调用它,然后尝试从 XFrame 类(可以访问 App)调用它们,但没有效果.
    • 哪个对象应该调用update_idletasks?没关系。无论您如何称呼它,它都会做同样的事情。
    • 我已更新我的答案以提供更多信息。也许您看不到任何效果,因为画布中没有可滚动的内容。
    • @HghfgHgfhfhgf:我仍然看不到您实际向画布添加框架的任何地方(提示:您必须使用 create_window 函数才能通过画布滚动)
    • 感谢提示;关于画布如何工作的最有帮助和令人大开眼界的。我制作了self.framesholder 对象(将其放在画布上),将我的框架放入其中,然后添加行:self.mastercanvas.create_window(0,0,window=self.framesholder)。我想滚动条现在应该以像素为单位跨帧持有人移动。 (只有画布覆盖了整个屏幕,我现在看不到滚动条,但我应该弄清楚。)
    猜你喜欢
    • 2012-09-05
    • 1970-01-01
    • 2021-11-18
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 2019-04-15
    • 2021-03-01
    • 2022-01-18
    相关资源
    最近更新 更多