【问题标题】:stacking identical frames with different contents in Tkinter在 Tkinter 中堆叠具有不同内容的相同帧
【发布时间】:2021-04-13 13:26:04
【问题描述】:

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

{

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()

}

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

【问题讨论】:

  • 你想要发生什么?你试过什么?
  • 让数据 img_file、name 和 color 成为给定长度的列表。我试图将列表放在 TestMainApplication 中,但这会导致“NameError:name 'img_file' is not defined”
  • 让数据 img_file、name 和 color 成为给定长度的列表。我试图将列表放在 TestMainApplication 中,但这会导致“NameError: name 'img_file' is not defined” 我想遍历列表并将框架及其标签小部件放置在有序的行和列中。实验室的内容必须相应更新。由于示例中的框架总是包含三个标签,我认为为此定义一个类是个好主意。我可以通过将所有内容放在一个类 (Appwindow()) 中轻松完成这项工作,其中列表在类外部定义。

标签: python tkinter


【解决方案1】:

好的,我不确定我是否理解正确,但这是一种思考方式;你总是需要一个实例的引用才能与之通信。因此,当我创建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()

这就是你所追求的吗?

【讨论】:

  • 它按预期工作。一个单独的框架定义类比所有东西都集中在一起更清晰。我需要进一步测试它以获得更通用的设置,但看不出它会有问题。主服务器解决方案确实很灵巧
  • 如果 image_list、name_list 和 color_list id 定义在任何类之外,例如,在类 TestFrame(tk.Frame) 之前,该怎么办:
  • 然后它们将位于全局命名空间中,您可以从任何类中读取它们。您可以在致电TestMainApplication 之前将它们放在任何位置。
猜你喜欢
  • 2017-08-24
  • 1970-01-01
  • 1970-01-01
  • 2021-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多