如果内容太大,可以使用滚动条的tkinter笔记本

2024-09-24 00:24:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个与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()

Tags: 图像imageselfdef画布widthframetk
1条回答
网友
1楼 · 发布于 2024-09-24 00:24:40

代码中的问题是,将画布的大小调整为图片的大小,因此画布和滚动区域的大小是相同的。它会让你的画布变大,你的标签和滚动条就没用了。在

我抑制了线条

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

draw函数中,滚动条的行为如预期。在

编辑:我错过了问题的另一部分。为了调整画布和滚动条的大小,我在build_outputnotebook中添加了以下行:

^{pr2}$

相关问题 更多 >