首页 > 解决方案 > 在 Tkinter 中堆叠具有不同内容的相同帧

问题描述

该示例显示三个具有相同内容的帧。我需要遍历任意数量的不同数据集:(img_file,名称和颜色)

{

import tkinter as tk
from tkinter import *
from tkinter import ttk
from PIL import Image, ImageTk


class TestFrame(tk.Frame):
    def __init__(self):
        super().__init__()
 
        image = Image.open(img_file)
        stamp = ImageTk.PhotoImage(image)
        
        labelImage = ttk.Label(self, image=stamp)
        labelImage.grid(row=0, column=0, rowspan=3)
        labelImage.image = stamp
        ttk.Label(self, text=name).grid(row=3, column=0)
        ttk.Label(self, text=color).grid(row=1, column=2)
        ttk.Label(self, text='Value: ').grid(row=0, column=1)
        ttk.Label(self, text='Color: ').grid(row=1, column=1)
        ttk.Label(self, text='Size: ').grid(row=2, column=1)        


class TestMainApplication(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title("Test Application")

        self.testFrame1 = TestFrame()
        self.testFrame2 = TestFrame()
        self.testFrame3 = TestFrame()
        self.testFrame1.grid(row=0, column=0, rowspan=3, columnspan=3, sticky='nsew')
        self.testFrame2.grid(row=3, column=0, rowspan=3, columnspan=3, sticky='nsew')
        self.testFrame3.grid(row=0, column=3, rowspan=2, columnspan=3, sticky='nsew')


img_file = 'myfile.jpg'
name = 'Flying Post Horn'
color = 'Orange Brown'


if __name__ == "__main__":
    TestMainApplication().mainloop()

}

框架gridding "self.testFrame1.grid(row=0, column=0, rowspan=3, columnspan=3,sticky='nsew')" 应该由变量控制,例如row=r 和column=c 难度是在我看来,如何在类之间传递必要的信息。

标签: pythontkinter

解决方案


好的,我不确定我是否正确理解了这一点,但这是一种思考方式;你总是需要一个实例的引用才能与之通信。因此,当我创建一个实例时,TestFrame()我必须将引用传递给它的创建者:self。现在,master 和 server 都知道他们可以传递和获取数据的每个 oters 名称。

为了能够向主实例请求图像,我必须使图像列表成为实例变量。我也列出了名称和颜色。

请参见下面的示例:

import tkinter as tk
from tkinter import *
from tkinter import ttk
from PIL import Image, ImageTk


class TestFrame(tk.Frame):
    def __init__(self, master, img_no, name_no, color_no):
        super().__init__()
 
        # Create image from item in master image_list
        image = Image.open(master.image_list[img_no])
        stamp = ImageTk.PhotoImage(image)
        labelImage = ttk.Label(self, image=stamp)
        labelImage.grid(row=0, column=0, rowspan=3)
        labelImage.image = stamp
        
        ttk.Label(self, text=master.name_list[name_no]).grid(row=3, column=0)
        ttk.Label(self, text=master.color_list[color_no]).grid(row=1, column=2)
        ttk.Label(self, text='Value: ').grid(row=0, column=1)
        ttk.Label(self, text='Color: ').grid(row=1, column=1)
        ttk.Label(self, text='Size: ').grid(row=2, column=1)        


class TestMainApplication(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title("Test Application")
        
        # Create the lists as instance variables
        self.image_list = ['jones.png', 'idle.png', 'cleese.png']
        self.name_list = ['Jones', 'Idle', 'Cleese']
        self.color_list = ['tomato', 'wheat', 'orange']

        # Pass parameters to TestFrame at creation, including instance reference
        self.testFrame1 = TestFrame(self, 0, 0, 0)
        self.testFrame2 = TestFrame(self, 1, 1, 1)
        self.testFrame3 = TestFrame(self, 2, 2, 2)
        self.testFrame1.grid(row=0, column=0, rowspan=3, columnspan=3, sticky='nsew')
        self.testFrame2.grid(row=3, column=0, rowspan=3, columnspan=3, sticky='nsew')
        self.testFrame3.grid(row=0, column=3, rowspan=2, columnspan=3, sticky='nsew')


if __name__ == "__main__":
    TestMainApplication().mainloop()

这就是你所追求的吗?


推荐阅读