2016-07-19 5 views
1

tkinterとのインターフェースを作成しようとしています。左にコントロールパネル、右に3つのタブがあるはずです。内容が大きすぎる場合は、スクロールバー付きのtkinterノートブック

タブには画像が表示されますが、画面には大きすぎる可能性がありますが、正確なサイズはプログラムによって動的に作成された後にのみわかります。だから、Notebookを展開して上部のウィンドウを埋めるようにしたいのですが、画像がノートブックフレームには大きすぎる場合は、すべての画像が見えるようにスクロールバーが表示されます。ノートブックにスクロールバーを付ける方法が見つからないので、ノートブックの中のキャンバスに貼り付けました。

以下のコードはキャンバスをイメージに合わせて展開しますが、スクロールバーはフレームよりも大きいキャンバスに合わせて伸びるので役に立たないため、ウィンドウの外に出ることがあります。

私は、スクロール領域を含むフレームのサイズに設定したいと思います。 Dynamically changing scrollregion of a canvas in Tkinterが関連しているようだが、私は自分のコードにそれを適用する方法を考え出すことはできません。

import tkinter as tk 
from tkinter import ttk 
from PIL import Image, ImageTk 


class App(tk.Frame): 

    def __init__(self, parent, *args, **kwargs): 
     self.parent = parent 
     super().__init__(parent, *args, **kwargs) 
     self.pack(expand=True, fill=tk.BOTH) 
     self.inputframe = ttk.Frame(self) 
     self.inputframe.pack(side=tk.LEFT, expand=False, fill=tk.Y) 
     self.outputnotebook = ttk.Notebook(self) 
     self.outputnotebook.pack(side=tk.RIGHT, expand=True, fill=tk.BOTH) 
     self.build_inputframe() 
     self.build_outputnotebook() 

    def build_inputframe(self): 
     run_button = ttk.Button(self.inputframe, text="Run", command=self.draw) 
     run_button.grid(column=2, row=0, sticky=(tk.W, tk.E)) 
     # rest of app... 

    def build_outputnotebook(self): 
     actnet_frame = ttk.Frame(self.outputnotebook) 
     critnet_frame = ttk.Frame(self.outputnotebook) 
     xscrollbar = ttk.Scrollbar(actnet_frame, orient=tk.HORIZONTAL) 
     xscrollbar.grid(row=1, column=0, sticky=tk.E + tk.W) 
     self.outputnotebook.add(
      actnet_frame, 
      text="Tab 1", 
      sticky=tk.N + tk.S + tk.E + tk.W) 
     self.outputnotebook.add(critnet_frame, text="Tab 2") 
     self.actnet_canvas = tk.Canvas(actnet_frame, width=400, height=400, 
             xscrollcommand=xscrollbar.set) 
     self.actnet_canvas.grid(row=0, sticky=tk.N + tk.S + tk.E + tk.W) 
     xscrollbar.config(command=self.actnet_canvas.xview) 

    def draw(self): 
     act_image = Image.open('critnet.png') # image is 875 x 175 
     width, height = act_image.size 
     actphoto = ImageTk.PhotoImage(act_image) 
     self.actnet_canvas.delete("all") 
     self.actnet_canvas.create_image(0, 0, anchor=tk.NW, image=actphoto) 
     self.actnet_canvas.image = actphoto 
     self.actnet_canvas['scrollregion'] = (0, 0, width, height) 
     self.actnet_canvas['width'] = width 
     self.actnet_canvas['height'] = height 
     #do similar for other tabs. 

root = tk.Tk() 
root.geometry("800x600") 
app = App(root) 
app.mainloop() 

答えて

2

あなたのコードに問題はあなたが絵のサイズでキャンバスのサイズを変更することで、程度の大きさキャンバスとスクロール領域は同じです。そしてそれはあなたのタブのためにあなたのキャンバスを大きくし、あなたのスクロールバーは役に立たなくなります。

Iはdraw関数と期待どおりに挙動スクロールバーからライン

self.actnet_canvas['width'] = width 
self.actnet_canvas['height'] = height 

を抑制しました。

編集:私は質問の他の部分を見逃していました。ウィンドウでキャンバスとスクロールバーのサイズを変更するには、build_outputnotebookに次の行を追加しました。

actnet_frame.rowconfigure(0,weight=1) 
actnet_frame.columnconfigure(0,weight=1) 
+0

これは確かに役立ちます。スクロールバーが機能し、フレームのサイズに合わせてキャンバスを拡大または縮小することについての部分にも答えることができます。ウィンドウのサイズを変更すると、スクロールバーが非表示になります。 –

関連する問題