如果内容太大,带有滚动条的tkinter笔记本

时间:2016-07-19 15:08:20

标签: python tkinter

我正在尝试使用tkinter创建一个接口。它应该在左侧有一个控制面板,在右边有一组3个标签。

选项卡将显示图像,这些图像对于屏幕来说可能太大,但是只有在程序动态创建后才能知道确切的大小。所以我希望有一个Notebook扩展以填充顶部窗口,如果图像对于笔记本框架而言太大,则应该出现滚动条以允许看到所有图像。我无法找到将滚动条附加到笔记本的方法,所以我将它们连接到笔记本内部的画布上。

我的代码扩展了画布以适合图像,但滚动条没有用,因为它会拉伸以适应画布,画布大于框架,因此最终可以在窗口外面。

我想我想将scrollregion设置为包含框架的大小。 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()

1 个答案:

答案 0 :(得分:2)

代码中的问题是您以画面大小调整画布大小,因此画布和scroll区域的大小是相同的。它会使你的画布变得很大,而你的标签和滚动条也没用。

我压制了行

self.actnet_canvas['width'] = width
self.actnet_canvas['height'] = height
来自draw函数的

和滚动条的行为符合预期。

编辑:我错过了问题的其他部分。要使用窗口调整画布和滚动条的大小,我在build_outputnotebook中添加了以下行:

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