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