2016-07-19 130 views
1

我的目標是創建一個具有垂直和水平滾動的GUI TKinter類。類內的Python Tkinter滾動條

我有一個圖表,其維度大於GUI的窗口維度。我把圖表放在畫布中,以啓用允許垂直和水平滾動的滾動條功能。

但是,當我運行我的代碼時,圖形大小會自動適應GUI窗口的大小,從而扭曲圖形比例並且滾動條功能不起作用。

有沒有人知道這個解決方案?這裏是代碼:

from tkinter import * 

from numpy import arange, sin, pi 
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg 

from matplotlib.figure import Figure 


class App(Tk): 
    def __init__(self): 
     Tk.__init__(self) 
     Frame_parent = Frame(self, bg = 'white', borderwidth = 0, relief = FLAT) 
     Frame_parent.pack(side = TOP, padx = 1, pady = 1) 

     Canvas_parent = Canvas(Frame_parent, scrollregion = (0, 0, 2000, 2000)) 
     vbar=Scrollbar(Frame_parent, orient = VERTICAL) 
     vbar.pack(side = RIGHT, fill = Y) 
     vbar.config(command = Canvas_parent.yview) 
     hbar=Scrollbar(Frame_parent, orient=HORIZONTAL) 
     hbar.pack(side=BOTTOM,fill=X) 
     hbar.config(command=Canvas_parent.xview) 

     Canvas_parent.config(xscrollcommand=hbar.set, yscrollcommand = vbar.set) 
     Canvas_parent.pack(side = LEFT, expand = True, fill = BOTH) 

     Frame_child = Frame(Canvas_parent, bg = 'white', borderwidth = 2, relief = FLAT) 
     Frame_child.pack(side = TOP, padx = 10, pady = 1) 


     f = Figure(figsize=(6, 5), dpi=100) 
     a = f.add_subplot(111) 
     t = arange(0.0, 3.0, 0.01) 
     s = sin(2*pi*t) 
     a.plot(t, s) 


     canvas = FigureCanvasTkAgg(f, Frame_child) 
     canvas.show() 
     canvas.get_tk_widget().pack(side = BOTTOM, fill = BOTH, expand = False) 

if __name__ == "__main__": 
    app = App() 
    app.geometry("400x400+51+51") 
    app.title("Test") 
    app.mainloop() 

回答

2

首先我要指出的是,你有很多無用的容器小部件。所以在我的解決方案中,我將刪除所有無用的代碼;我的意思是所有與Frame_parentFrame_childCanvas_parent有關的內容。請注意,在我的解決方案中,我可以讓這些小部件就位,但從原則上講,我不編碼我不使用的東西。

第二個重要提示是,您要滾動canvas的圖表,但您的代碼正在嘗試滾動Canvas_parent小部件。這是你問題的核心。因此,您將需要使用FigureCanvasTkAgg.get_tk_widget()並在其返回的對象上應用config()方法。

這意味着你將需要改變:

Canvas_parent.config(xscrollcommand=hbar.set, yscrollcommand = vbar.set) 

要:

canvas.get_tk_widget().config(xscrollcommand=hbar.set, yscrollcommand=vbar.set) 

這裏是解決方案:

from tkinter import * 

from numpy import arange, sin, pi 
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg 

from matplotlib.figure import Figure 

class App(Tk): 
    def __init__(self): 
     Tk.__init__(self) 
     self.configure(width=400, height=400) 


     f = Figure(figsize=(6, 5), dpi=100) 
     a = f.add_subplot(111) 
     t = arange(0.0, 3.0, 0.01) 
     s = sin(2*pi*t) 
     a.plot(t, s) 

     canvas = FigureCanvasTkAgg(f, self) 
     canvas.show() 
     canvas.get_tk_widget().grid(row=0, column=0) 

     vbar=Scrollbar(self, orient = VERTICAL) 
     vbar.grid(row=0, column=1)  
     hbar=Scrollbar(self, orient=HORIZONTAL) 
     hbar.grid(row=1, column=0) 


     canvas.get_tk_widget().config(xscrollcommand=hbar.set, yscrollcommand = vbar.set) 

     hbar.config(command=canvas.get_tk_widget().xview) 
     vbar.config(command=canvas.get_tk_widget().yview) 



if __name__ == "__main__": 
    app = App() 
    app.geometry("400x400+51+51") 
    app.title("Test") 
    app.mainloop() 

這裏是上面的程序運行的截圖:

enter image description here

請注意,如果你想伸展滾動條看起來不再像你的代碼,你可以添加選項vbar.grid(..., sticky=N+S, ...)hbarhbar.grid(..., sticky=W+E, ...)hbar

+0

它的工作原理。非常感謝您的反饋和代碼解釋。我對滾動條在tkinter上的工作原理有了更多的瞭解。 – Fxs7576

+0

不客氣。 –