Python 2.7 滚动条可见且可滑动,但不起滚动条的作用

Python 2.7 滚动条可见且可滑动,但不起滚动条的作用,python-2.7,canvas,matplotlib,tkinter,scrollbar,Python 2.7,Canvas,Matplotlib,Tkinter,Scrollbar,堆栈溢出 因此,我对一般编程比较陌生,正在从事一个小项目,该项目涉及通过matplotlib将数据实时流化到gui中,我或多或少使用Tkinter创建了gui。无论如何,根据用户选择的选项,我必须输出的图形数量从1到18不等。考虑到潜在的大量图形,我需要滚动条,为此我无耻地从另一篇stackoverflow文章中获取了代码,并试图修改以适应我的程序。代码如下: #Create popup window for graph display tlg = Toplevel() tlg.geom

堆栈溢出

因此,我对一般编程比较陌生,正在从事一个小项目,该项目涉及通过matplotlib将数据实时流化到gui中,我或多或少使用Tkinter创建了gui。无论如何,根据用户选择的选项,我必须输出的图形数量从1到18不等。考虑到潜在的大量图形,我需要滚动条,为此我无耻地从另一篇stackoverflow文章中获取了代码,并试图修改以适应我的程序。代码如下:

    #Create popup window for graph display
tlg = Toplevel()
tlg.geometry('400x400')
tlg.title('Live Data Stream')

#Set frame for canvas
frame=Frame(tlg,width=300,height=300)
frame.pack(fill=BOTH,expand=True) #allows dynamic resizing of frame/scrollbar

#Create a canvas on which to play scrollbar widget
canvas=Canvas(frame,bg='#FFFFFF',width=300,height=300,scrollregion=(0,0,500,500))

#Add horizontal and vertical scrollbars
hbar=Scrollbar(frame,orient=HORIZONTAL)
hbar.pack(side=BOTTOM,fill=X) 
hbar.config(command=canvas.xview)
vbar=Scrollbar(frame,orient=VERTICAL)
vbar.pack(side=RIGHT,fill=Y)
vbar.config(command=canvas.yview)

#Pack and implement canvas
canvas.config(width=300,height=300,scrollregion=canvas.bbox("all"))
canvas.config(xscrollcommand=hbar.set, yscrollcommand=vbar.set)
canvas.pack(side=LEFT,expand=True,fill=BOTH)

#######################------- MatPlotLib Graph Creation --------#######################
tlglabel1 = Label(canvas, text='LIVE DATA STREAM', font=('VERDANA',12,'bold'),
                  bg='white').grid(row=0,padx=5,pady=5)

quadl = plt.figure(1,figsize=(5,5))
plt.clf()
quadlx=[1,2,3,4,5,6,7,8]
quadly=[3,4,5,2,3,4,1,6]
plt.plot(quadlx,quadly)
plt.gcf().canvas.draw()
canvasql = FigureCanvasTkAgg(quadl,canvas)
canvasql.get_tk_widget().grid(row=1,column=1)
toolbarql = NavigationToolbar2TkAgg(canvasql,canvas)
toolbarql.grid(row=2,column=1)

quadr = plt.figure(2,figsize=(5,5))
plt.clf()
quadrx=[1,2,3,4,5,6,7,8]
quadry=[3,4,5,2,3,4,1,6]
plt.plot(quadrx,quadry)
plt.gcf().canvas.draw()
canvasqr = FigureCanvasTkAgg(quadr,canvas)
canvasqr.get_tk_widget().grid(row=1,column=2,padx=10)
toolbarqr = NavigationToolbar2TkAgg(canvasqr,canvas)
toolbarqr.grid(row=2,column=2,padx=10)
我添加了两个测试图只是为了测试滚动条的功能,在测试之后,滚动条什么都做不了。我真的不知道该怎么办。我尝试用
scrollregion=canvas.bbox('all')
替换第一个
scrollregion=(0,0500500)
,因为其他所有的滚动条代码都有,但随后它删除了我的画布并完全删除了我的滚动条。我尝试将
hbar=Scrollbar(frame,orient=HORIZONTAL)
替换为
hbar=Scrollbar(canvas,orient=HORIZONTAL)
,认为滚动条需要移动画布,但这导致程序崩溃。我试图通过另一个论坛的推荐,将
command=canvas.xview
command=canvas.yview
改为
frame
,但失败了。所以,我被卡住了。

请阅读s。你发布的代码一半与问题无关,另一半不完整

滚动框架需要一个外部框架,其中包含一个画布和一个或两个链接的滚动条,以及一个放置在画布上的内部框架,以便它随画布移动。两者都可以是一个实验室框架。下面是3.5 idlelib.configDialog中用于垂直滚动帧的代码。水平滚动条很容易添加。请注意,它有两种方法来保持大小同步

class VerticalScrolledFrame(Frame):
    """A pure Tkinter vertically scrollable frame.

    * Use the 'interior' attribute to place widgets inside the scrollable frame
    * Construct and pack/place/grid normally
    * This frame only allows vertical scrolling
    """
    def __init__(self, parent, *args, **kw):
        Frame.__init__(self, parent, *args, **kw)

        # create a canvas object and a vertical scrollbar for scrolling it
        vscrollbar = Scrollbar(self, orient=VERTICAL)
        vscrollbar.pack(fill=Y, side=RIGHT, expand=FALSE)
        canvas = Canvas(self, bd=0, highlightthickness=0,
                        yscrollcommand=vscrollbar.set, width=240)
        canvas.pack(side=LEFT, fill=BOTH, expand=TRUE)
        vscrollbar.config(command=canvas.yview)

        # reset the view
        canvas.xview_moveto(0)
        canvas.yview_moveto(0)

        # create a frame inside the canvas which will be scrolled with it
        self.interior = interior = Frame(canvas)
        interior_id = canvas.create_window(0, 0, window=interior, anchor=NW)

        # track changes to the canvas and frame width and sync them,
        # also updating the scrollbar
        def _configure_interior(event):
            # update the scrollbars to match the size of the inner frame
            size = (interior.winfo_reqwidth(), interior.winfo_reqheight())
            canvas.config(scrollregion="0 0 %s %s" % size)
        interior.bind('<Configure>', _configure_interior)

        def _configure_canvas(event):
            if interior.winfo_reqwidth() != canvas.winfo_width():
                # update the inner frame's width to fill the canvas
                canvas.itemconfigure(interior_id, width=canvas.winfo_width())
        canvas.bind('<Configure>', _configure_canvas)

        return
类垂直滚动帧(帧):
“”“纯Tkinter垂直可滚动框架。
*使用“内部”属性将小部件放置在可滚动框架内
*正常建造和包装/放置/网格
*此框架仅允许垂直滚动
"""
定义初始值(自、父、*args、**kw):
帧。\uuuuu初始化(自,父,*args,**kw)
#创建画布对象和用于滚动的垂直滚动条
vscrollbar=滚动条(自,方向=垂直)
vscrollbar.pack(填充=Y,侧边=RIGHT,展开=FALSE)
画布=画布(自我,bd=0,highlightthickness=0,
yscrollcommand=vscrollbar.set,宽度=240)
canvas.pack(side=LEFT,fill=BOTH,expand=TRUE)
vscrollbar.config(命令=canvas.yview)
#重置视图
canvas.xview_moveto(0)
canvas.yview_moveto(0)
#在画布内创建一个框架,该框架将与其一起滚动
self.interior=内部=框架(画布)
内部\u id=画布。创建\u窗口(0,0,窗口=内部,锚定=NW)
#跟踪画布和帧宽度的更改并同步它们,
#同时更新滚动条
def_配置_内部(事件):
#更新滚动条以匹配内部框架的大小
大小=(interior.winfo_reqwidth(),interior.winfo_reqheight())
canvas.config(scrollregion=“0%s%s”%size)
内部绑定(“”,\u配置\u内部)
定义配置画布(事件):
if interior.winfo_reqwidth()!=canvas.winfo_width():
#更新内部框架的宽度以填充画布
canvas.itemconfigure(interior\u id,width=canvas.winfo\u width())
canvas.bind(“”,\u configure\u canvas)
返回

这个最简单的解决方案是安装Python Metawidgets(Pmw)扩展并使用其内置的ScrolledFrame Terry,除了我在最后遗漏了导入和tlg.mainloop()之外,我不明白我缺少的mcve是什么。我提供的代码包含我的问题,这是我编写的滚动条代码,以及一种使用matplotlib图测试滚动条是否工作的方法,因为我读到不能滚动空白板岩。不管怎样,我已经读过mcve的,并且会记住这一点。就答案而言,我想我明白了。首先,我将给Curly Joe一个机会,因为Pmw ScrolledFrame似乎更容易。我假设您想要一个可滚动的框架,因为a)您希望将每个图形放在自己的画布上,而不是在一个画布上放置多达18个图形;b)您希望将画布网格化(或放置)在框架上。。。没有完整的代码,我无法复制、粘贴和运行。有了matlab导入和matlab代码,我也无法运行。例如,要测试滚动,您只需要添加一个Text()并插入类似于
(“现在是所有“*10+'\n'+”时间“*10+'\n”)*50”
,这将使正确的操作可见。