tkinter图像通过控制器调整大小

时间:2017-11-02 17:31:40

标签: python tkinter

我用tkinter编写了一个使用类作为结构的应用程序。我非常接近常见的 sentdex 结构(参见链接:Tkinter and ttk in python 2.7),其中每个新页面基本上都是一个通过控制器功能提升到顶部的框架。目前,我正在尝试找到一种解决方案,以便在根窗口最大化/最小化时自动调整背景图像的大小。我找到了一个解决方案,但它不能满足我的需求100%,因为这里的函数与图像在同一个类中:(见链接:Tkinter resize background image to window size (Python 3.4)

我需要一个通用功能,它引用页面(知道其中来调整图像大小),然后调整一个图像的大小 - 在最好的情况下 - 保存在这个特定页面上。

我尝试使用lambda: controller失败了。如果有人阻止我在每页上编写resizeimage - 函数的硬编码,我会很高兴。

这是我的代码:

import tkinter as tk
from tkinter import font  as tkfont
from PIL import Image, ImageTk

这里我创建了控制器类:

class SampleApp(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)


        container = tk.Frame(self)
        container.pack(side="top", fill="both", expand=True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        self.frames = {}
        for F in (StartPage, PageOne):
            page_name = F.__name__
            frame = F(container,self)
            self.frames[page_name] = frame
            frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame("StartPage")

    def show_frame(self, page_name):
        #Show a frame for the given page name
        frame = self.frames[page_name]
        frame.tkraise()

这是我尝试编码的resizeImage函数:

    def resizeImage(self):

        # give me an image
        img = self.frames[StartPage].img
        # give me an image copy
        img_copy = self.frames[StartPage].img_copy
        # give me background image
        background_image = self.frames[StartPage].background_image

        new_width = event.width
        new_height = event.height

        img = img_copy.resize((new_width, new_height))

        background_image = ImageTk.PhotoImage(img)
        background.configure(image= background_image)

此帧包含应通过控制器功能

调整大小的图像
class StartPage(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)


        self.img = Image.open("*.png")

        self.img_copy= self.img.copy()

        self.background_image = ImageTk.PhotoImage(self.img)

        self.background = tk.Label(self, image=self.background_image)
        self.background.grid()
        self.background.bind('<Configure>',controller.resizeImage())

最后这是一个空框架/页面,只是为了确保控制器类中的循环有效:

class PageOne(tk.Frame):
# this is an empty frame
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)

if __name__ == "__main__":
    app = SampleApp()
    app.mainloop()

1 个答案:

答案 0 :(得分:0)

我听从了Nae的建议:)

谢谢朋友!

ar3=ar2[~np.isnan(ar2).any(axis=1)]