python - 在 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 难度是在我看来,如何在类之间传递必要的信息。
解决方案
好的,我不确定我是否正确理解了这一点,但这是一种思考方式;你总是需要一个实例的引用才能与之通信。因此,当我创建一个实例时,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()
这就是你所追求的吗?
推荐阅读
- javascript - 提交联系表格后如何到达页面上的特定位置?
- laravel - 如何使用 jwt 在 Laravel 中授权用户和管理员?
- c# - EF Core - 使用参考导航属性(外键)保存的模式
- solr - Solr:使用 * 时没有返回结果
- amazon-web-services - 如何在 CloudFormation 的安全组中同时指定 IPv6 和 v4?
- mysql - 如何正确编写 SQL 查询?
- c - 用数组中的数据填充结构
- php - 访问回调函数外的变量递归数组遍历
- node.js - nodejs socket.io 客户端不交换发出的消息
- machine-learning - 访问经过训练的自动编码器的降维