首页 > 解决方案 > Python 类从 tk.Frame 继承,具有列表属性

问题描述

我正在自学 tkinter(面向对象的风格)。

我希望我的班级制作一个带有单个标签的简单窗口。我希望标签的文本来自一个属性,一个列表的第一个元素。这是一个用 Paint 制作的模型,我希望窗口看起来像:

在此处输入图像描述

但是当我运行下面的代码时,我收到一条错误消息(TypeError: create() argument 1 must be str or None, not list)。我不知道如何通过“my_list”来创建我的类的实例。

谢谢你的帮助!

import tkinter as tk

my_list = [222, 333, 444, 555]

class MyWindow(tk.Frame):
    def __init__(self, parent,  lst):
        self.lst = lst
        tk.Frame.__init__(self, parent)
        self.window_height = 200
        self.window_width = self.window_height * 2 
        canvas = tk.Canvas(self, width=self.window_width, height=self.window_height)
        canvas.pack()  
        label = tk.Label(self, text=str(self.lst[0]))       
        label.pack()
    
root= tk.Tk(my_list)
MyWindow(root).pack()
root.mainloop()

标签: pythonooptkinter

解决方案


首先,您不能传递my_listtk.Tk().

其次,您MyWindow需要两个参数:parentlist(尽管您应该将第二个参数命名为不同的名称)。

第三,在创建小部件时调用几何管理器(pack、、gridplace)是一种不好的做法,应该避免。

以下是最终代码块的外观:

root= tk.Tk()
mywindow = MyWindow(root, my_list)
mywindow.pack()

这将最终得到一个底部有标签的窗口。如果您希望它位于顶部,请颠倒您在框架中打包项目的顺序和/或明确说明它们应该去哪里:

label.pack(side="top", fill="x")
canvas.pack(side="bottom", fill="both", expand=True)

推荐阅读