对 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/