【问题标题】:Python and GeoTiff images, scrolling problemPython 和 GeoTiff 图片,滚动问题
【发布时间】:2023-02-03 18:37:19
【问题描述】:

我有一个问题,这是打开 GeoTiff 迷你照片库窗口但滚动对我不起作用的代码。代码有什么问题?我的印象是倒带和照片是两个独立的东西,我不知道如何将它们“粘合”在一起。非常感谢您的帮助。

import tkinter as tk
import glob


from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
import rasterio as rio

from rasterio.plot import show

SIZE_X = 100

SIZE_Y = 100

class Icon:
    def __init__(self, root):
        self.root = root

    self.ybar = tk.Scrollbar(self.root)
    self.item_canvas = tk.Canvas(self.root, width=354, height=401,
                                 yscrollcommand=self.ybar.set)

    self.ybar.configure(command=self.item_canvas.yview)

    self.item_canvas.configure(scrollregion=(0, 0, 1000, 1000))
    self.item_canvas.configure(background='#d8d8d9')

    self.ybar.pack(side=tk.RIGHT, fill=tk.Y)
    self.item_canvas.pack(side=tk.LEFT, expand=tk.TRUE, fill=tk.BOTH)

    self.get_icons()

def get_dir(self):
    link = r'work_dir/*.txt'
    with open(link) as f:
        self.file_photo = f.read()
        self.link_to_dir = glob.glob(self.file_photo.rsplit('/', 1)[0] + '/*.tif')
        self.number = len(self.link_to_dir)

def get_icons(self):
    '''Method to add a mini gallery'''
    self.get_dir()

    FIGSIZE = 2.5
    self.counter = -1

    if self.number <= 2:
        for i in range(0, self.number):
            self.fig = Figure(figsize=(FIGSIZE, FIGSIZE), dpi=60)
            self.canvasGeo = FigureCanvasTkAgg(self.fig, self.root)
            self.canvasGeo.get_tk_widget().place(x=i * 220, y=10)

            with rio.open(self.link_to_dir[i]) as src_plot:
                show(src_plot, ax=self.fig.add_subplot())
            self.canvasGeo.draw()


    elif self.number > 2:
        k = int()
        y = []
        for i in range(0, self.number):
            if i % 2 == 0:
                k = i
            y.append(k)
        for j in range(0, self.number):
            self.counter += 1
            if (j * 220) <= 220:
                self.fig = Figure(figsize=(FIGSIZE, FIGSIZE), dpi=60)
                self.canvasGeo = FigureCanvasTkAgg(self.fig, self.root)
                self.canvasGeo.get_tk_widget().place(x=10 + j * 190, y=10)

                with rio.open(self.link_to_dir[y[j]]) as src_plot:
                    show(src_plot, ax=self.fig.add_subplot())
                self.canvasGeo.draw()
            else:
                self.fig = Figure(figsize=(FIGSIZE, FIGSIZE), dpi=60)
                self.canvasGeo = FigureCanvasTkAgg(self.fig, self.root)
                self.canvasGeo.get_tk_widget().place(x=(-175 * y[j]) + j * 180, y=85*y[j])

                with rio.open(self.link_to_dir[y[j]]) as src_plot:
                    show(src_plot, ax=self.fig.add_subplot())
                self.canvasGeo.draw()
    else:
        tk.Label(self.root, text='Wrong Value').place(x=220, y=10)

if __name__ == '__main__':
    root = tk.Tk()
    Icon(root)
    root.mainloop()

【问题讨论】:

    标签: python


    【解决方案1】:

    定义 self.item_canvas 后,添加以下行:

    self.ybar.config(command=self.item_canvas.yview)
    

    并将画布的 scrollregion 设置为的行更新为:

    self.item_canvas.configure(scrollregion=(0, 0, 354, 401))
    

    新代码(以防您不知道在哪里添加上述代码行):

    import tkinter as tk
    import glob
    from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
    from matplotlib.figure import Figure
    import rasterio as rio
    from rasterio.plot import show
    SIZE_X = 100
    SIZE_Y = 100
    
    class Icon:
        def __init__(self, root):
            self.root = root
    
            self.ybar = tk.Scrollbar(self.root)
            self.item_canvas = tk.Canvas(self.root, width=354, height=401,
                                         yscrollcommand=self.ybar.set)
    
            self.ybar.configure(command=self.item_canvas.yview)
    
            self.item_canvas.configure(scrollregion=(0, 0, 1000, 1000))
            self.item_canvas.configure(background='#d8d8d9')
    
            self.ybar.pack(side=tk.RIGHT, fill=tk.Y)
            self.item_canvas.pack(side=tk.LEFT, expand=tk.TRUE, fill=tk.BOTH)
    
            self.get_icons()
    
        def get_dir(self):
            link = r'work_dir/*.txt'
            with open(link) as f:
                self.file_photo = f.read()
                self.link_to_dir = glob.glob(self.file_photo.rsplit('/', 1)[0] + '/*.tif')
                self.number = len(self.link_to_dir)
    
        def get_icons(self):
            '''Method to add a mini gallery'''
            self.get_dir()
    
            FIGSIZE = 2.5
            self.counter = -1
    
            if self.number <= 2:
                for i in range(0, self.number):
                    self.fig = Figure(figsize=(FIGSIZE, FIGSIZE), dpi=60)
                    self.canvasGeo = FigureCanvasTkAgg(self.fig, self.root)
                    self.canvasGeo.get_tk_widget().place(x=i * 220, y=10)
    
                    with rio.open(self.link_to_dir[i]) as src_plot:
                        show(src_plot, ax=self.fig.add_subplot())
                    self.canvasGeo.draw()
    
    
        elif self.number > 2:
            k = int()
            y = []
            for i in range(0, self.number):
                if i % 2 == 0:
                    k = i
                y.append(k)
            for j in range(0, self.number):
                self.counter += 1
                if (j * 220) <= 220:
                    self.fig = Figure(figsize=(FIGSIZE, FIGSIZE), dpi=60)
                    self.canvasGeo = FigureCanvasTkAgg(self.fig, self.root)
                    self.canvasGeo.get_tk_widget().place(x=10 + j * 190, y=10)
    
                    with rio.open(self.link_to_dir[y[j]]) as src_plot:
                        show(src_plot, ax=self.fig.add_subplot())
                    self.canvasGeo.draw()
                else:
                    self.fig = Figure(figsize=(FIGSIZE, FIGSIZE), dpi=60)
                    self.canvasGeo = FigureCanvasTkAgg(self.fig, self.root)
                    self.canvasGeo.get_tk_widget().place(x=(-175 * y[j]) + j * 180, y=85*y[j])
    
                    with rio.open(self.link_to_dir[y[j]]) as src_plot:
                        show(src_plot, ax=self.fig.add_subplot())
                    self.canvasGeo.draw()
        else:
            tk.Label(self.root, text='Wrong Value').place(x=220, y=10)
    
    if __name__ == '__main__':
        root = tk.Tk()
        Icon(root)
        root.mainloop()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-15
      相关资源
      最近更新 更多