2016-07-19 3 views
1

Ich versuche, eine Schnittstelle mit Tkinter zu erstellen. Es sollte ein Kontrollfeld auf der linken Seite und ein Satz von 3 Tabs auf der rechten Seite haben.Ein Tkinter Notebook mit Bildlaufleisten, wenn der Inhalt zu groß ist

Die Registerkarten zeigen Bilder an, die für den Bildschirm möglicherweise zu groß sind, die genaue Größe ist jedoch erst bekannt, nachdem sie vom Programm dynamisch erstellt wurden. Ich möchte also eine Notebook, die erweitert wird, um das obere Fenster zu füllen, und wenn das Bild für den Notebook-Rahmen zu groß ist, sollten Bildlaufleisten angezeigt werden, damit das gesamte Bild angezeigt werden kann. Ich kann keine Möglichkeit finden, Bildlaufleisten an das Notebook anzuhängen, also habe ich sie an die Leinwände im Notebook angeschlossen.

Mein Code unten erweitert die Zeichenfläche an das Bild, aber die Bildlaufleiste ist nutzlos, da sie sich an die Leinwand anpasst, die größer als der Rahmen ist und daher außerhalb des Fensters enden kann.

Ich denke, ich möchte die Scrollregion auf die Größe des umgebenden Rahmens festlegen. Dynamically changing scrollregion of a canvas in Tkinter scheint verwandt zu sein, aber ich kann nicht herausfinden, wie das meinen Code anwenden:

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() 

Antwort

2

Das Problem in Ihrem Code ist, dass Sie die Leinwand in der Größe des Bildes Größe ändern, so dass die Größe von die Leinwand und die Scrollregion sind gleich. Und es macht Ihre Leinwand zu groß für Ihre Registerkarte und Ihre Bildlaufleiste nutzlos.

I unterdrückte die Linien

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

von der Funktion und der draw scrollbar wie erwartet verhalten hat.

Edit: Ich hatte den anderen Teil der Frage verpasst. Um die Leinwand und die Bildlaufleiste mit dem Fenster zu vergrößern, habe ich die folgenden Zeilen in build_outputnotebook hinzugefügt:

+0

Das hilft sicherlich. Die Bildlaufleiste funktioniert, können Sie auch den Teil über das Vergrößern oder Verkleinern der Leinwand auf die Größe des Rahmens beantworten. Wenn das Fenster in der Größe geändert wird, werden die Bildlaufleisten ausgeblendet. –