当前位置: 首页 > 知识库问答 >
问题:

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

暴向笛
2023-03-14

我试图创建一个与tkinter接口。它应该在左边有一个控制面板,右边有一组3个标签。

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

下面的代码扩展了画布以适应图像,但是滚动条是无用的,因为它会拉伸以适应画布,而画布比框架大,因此最终可能会出现在窗口之外。

我想我要将滚动区域设置为包含帧的大小。在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个答案

皮弘博
2023-03-14

代码中的问题是,您根据图片的大小调整了画布的大小,因此画布和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)
 类似资料:
  • 我的目标是在一个有几个标签的框架中添加一个垂直滚动条。当框架内的标签超过框架的高度时,滚动条应该自动启用。经过搜索,我发现了这个有用的帖子。根据那篇文章,我明白为了实现我想要的,(如果我错了,请纠正我,我是一个初学者)我必须先创建一个框架,然后在框架内创建一个画布,并粘贴滚动条到那个框架。之后,创建另一个框架,并将其作为窗口对象放在画布内。所以,我终于想出了这个: 我这样做对吗?有没有更好/更聪明

  • 我无法让x和y滚动条在使用Python的Tkinter中工作,尽管我已经遵循了多个示例: 如何在python 3.4中使用tkinter添加2个滚动条 在tkinter中添加滚动条到一组小部件 如何在tkinter中制作一个合适的双滚动条框架 垂直和水平滚动条上的Tkinter小部件 水平和垂直滚动画布小部件 滚动条会出现,但当窗口小于框架时不会激活。我怎样才能让它工作(见下图)? 下面是产生我的

  • 问题内容: 我的目标是向具有多个标签的框架添加垂直滚动条。一旦框架内的标签超过框架的高度,滚动条应自动启用。搜索之后,我发现了这个有用的帖子。根据该帖子,我了解到要实现我想要的功能(如果我错了,请纠正我,我是一个初学者),我必须先创建一个,然后在该框架内创建一个并将滚动条粘贴到该框架上好。之后,创建另一个框架并将其作为窗口对象放在画布内。所以,我终于想出了这个: 我做对了吗?有没有更好/更聪明的方

  • Scrollbar 控件常用于创建一个水平或者垂直的滚动条,通常情况下,Scrollbar 控件可以与 Listbox、Text、Canvas 以及 Entry 等控件一起使。 滚动条控件是 GUI  程序中经常使用的一种控件类型,它主要用来控制控件区域的可见范围,比如当 Text 控件的文本内容非常多时,为了方便用户阅读,可以给 Text 控件增加滚动条,用户只需拖动滚动条就能完成内容的阅读。

  • 我想打印我的html页面到一个PDF文件,但不想滚动条显示在那里的PDF文件。和我的页面有一个可滚动的主体,所以如果我设置如下: 在最终的pdf文件中,正文将是不完整的。那么,如果有一种方法,只是阻止滚动条显示,但内容仍然是可滚动的?

  • 我拥有的是一个简单的,后跟两个子元素,和。 具有固定的高度,应填充剩余的空白空间。这很容易通过实现,但是由于某种原因,我不知道如何使元素溢出,以便在其内容超过网站窗口高度时工作? 这里是一个JSFiddle,如果您设置高度为,您可以看到元素很好地填充了空间,但是当大得多时元素不应该扩展现在的情况我错过了什么? 如果可能的话,我宁愿不使用JavaScript来解决这个问题。