我用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()
答案 0 :(得分:0)
我听从了Nae的建议:)
谢谢朋友!
ar3=ar2[~np.isnan(ar2).any(axis=1)]