python - 在 Tkinter 中将滚动条拉伸(stretch)到 Canvas 大小

标签 python tkinter

对 Tkinter 来说还很陌生。 我看过很多关于这个问题的帖子,但没有一个为我解决。 我正在尝试创建一个简单的 GUI,其中有一个显示图像的 Canvas 。 Canvas 是可滚动的,但滚动条不会拉伸(stretch)到 Canvas 的大小。

以下是我的代码的相关部分。这里没有实际显示图像的代码,图像是由 openFileDialog 给出的,但滚动条与图像保持相同。

from Tkinter import *
import Image
import ImageTk
import numpy as np
import tkFileDialog
import os as os

class DIP(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent) 
        self.parent = parent        
        self.initUI()
        self.isOpenedYet = False

    def initUI(self):
        self.parent.title("Viewer")
        self.pack(fill = BOTH, expand = 1)

        menubar = Menu(self.parent)
        self.parent.config(menu = menubar)

        vsframe = Frame(self, width=500, height=500)
        vsframe.grid(row = 1, column = 2, columnspan = 2, sticky = "nw")
        hsframe = Frame(self, width=500, height=500)
        hsframe.grid(row = 2, column = 1, rowspan = 2, sticky = "nw")
        self.canv = Canvas(self, relief=SUNKEN)
        self.canv.config(width=500, height=500)
        self.canv.config(highlightthickness=0)
        self.sbarV = Scrollbar(vsframe, orient=VERTICAL)
        self.sbarH = Scrollbar(hsframe, orient=HORIZONTAL)
        self.sbarV.config(command=self.canv.yview)
        self.sbarH.config(command=self.canv.xview)

        self.canv.config(yscrollcommand=self.sbarV.set)
        self.canv.config(xscrollcommand=self.sbarH.set)

        self.sbarV.pack(expand = YES, fill=BOTH)
        self.sbarH.pack(expand = YES, fill=BOTH)

        self.label2 = Label(self, border = 5)
        self.label2.grid(row = 0, column = 1)
        self.canv.grid(row = 1, column = 1, sticky = "nw")

        #Open Image Menu
        fileMenu = Menu(menubar)
        fileMenu.add_command(label = "Open", command = self.onOpen)
        menubar.add_cascade(label = "File", menu = fileMenu)

        #menu for algorithms
        basicMenu = Menu(menubar)
        basicMenu.add_command(label = "Super Resolution-stub", command = self.SuperRes)
        menubar.add_cascade(label = "Algorithms", menu = basicMenu)

我错过了什么?

最佳答案

这里发生了一些事情。

首先,您不需要将滚动条放在单独的框架中。它们可以(并且通常应该)与 Canvas 放在同一帧中。

其次,您的滚动框架没有正确的“粘性”值。垂直滚动条需要“粘”到其所给区域的顶部和底部,水平滚动条需要“粘”到其所给区域的左侧和右侧。此外,您的 Canvas 应该“粘”到其区域的所有侧面,以便它填充该区域。

第三,您没有为行和列赋予任何权重,因此它们不会按照您期望的方式调整大小。在您的例子中,您希望为包含 Canvas 的行和列赋予权重 1(一),因此它会占用 GUI 中的所有额外空间。

综合所有建议,以下是如何获得您想要的东西:

def initUI(self):
    self.parent.title("Viewer")
    self.pack(fill = BOTH, expand = 1)

    menubar = Menu(self.parent)
    self.parent.config(menu = menubar)

    self.grid_rowconfigure(1, weight=1)
    self.grid_columnconfigure(1, weight=1)

    self.canv = Canvas(self, relief=SUNKEN)
    self.canv.config(width=500, height=500)
    self.canv.config(highlightthickness=0)
    self.sbarV = Scrollbar(self, orient=VERTICAL)
    self.sbarH = Scrollbar(self, orient=HORIZONTAL)

    self.sbarV.config(command=self.canv.yview)
    self.sbarH.config(command=self.canv.xview)

    self.canv.config(yscrollcommand=self.sbarV.set)
    self.canv.config(xscrollcommand=self.sbarH.set)

    self.sbarV.grid(row=1, column=2, sticky="ns")
    self.sbarH.grid(row=2, column=1, sticky="ew")

    self.label2 = Label(self, border = 5, text="label 2")
    self.label2.grid(row = 0, column = 1)
    self.canv.grid(row = 1, column = 1, sticky = "nsew")

    ...

顺便说一句,这里有一个调试此类问题的技巧:在开发过程中为每个“大”小部件(框架、 Canvas 、文本小部件)指定独特的背景颜色。例如,给“自己”一个蓝色背景,给 Canvas 一个粉红色背景,等等。可以更轻松地查看每个项目的去向以及它们相对于彼此如何调整大小。如果没有这个,有时很难知道屏幕上的某些空白区域是否属于主窗口、子窗口等。

关于python - 在 Tkinter 中将滚动条拉伸(stretch)到 Canvas 大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22047206/

相关文章:

python - 使用类制作 Tkinter Gui

python - 获取 tkinter Entry 字段的值以在函数中(本地)使用

python - 如何使用Python中的Tkinter,使用几个选定颜色的迭代来更改Python中的圆圈颜色,这些颜色随着每次按下按钮而变化?

Python:防止信号传播到子线程

python - 从 0 开始创建新的 pandas 列

python - Keras 中的线性插值

python - Pandas :计算到下一个真实的定向距离

python - ImportError:python26.dll 的模块使用与此版本的 Python 冲突

python - 如何在另一个 tk.button 函数运行时检查按钮是否按下?

python - 删除 tkinter 文本默认绑定(bind)