2016-07-19 137 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_childおよびCanvas_parentに関連するすべてを意味します。以下の私のソリューションでは、それらのウィジェットを適切な場所に置くことができますが、原則として、私が使用しないものはコーディングしません。

第2の重要な点は、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

あなたのコードのように長く見えるようにスクロールバーを伸ばしたい場合、あなたはhbarhbarためhbar.grid(..., sticky=W+E, ...)ためのオプションvbar.grid(..., sticky=N+S, ...)を追加することもできます。

+0

これは機能します。フィードバックとコードの説明に感謝します。私は、スクロールバーがtkinterでどのように動作するかをもっと理解しています。 – Fxs7576

+0

ようこそ。 –

関連する問題