Python класс Наследование от tk.Frame с атрибутом list - PullRequest
0 голосов
/ 14 июля 2020

Я обучаюсь 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()

1 Ответ

0 голосов
/ 14 июля 2020

Во-первых, вы не можете передать my_list в tk.Tk().

Во-вторых, ваш MyWindow требует двух параметров: parent и list (хотя вы должны назвать этот второй параметр по-другому) .

В-третьих, вызов диспетчера геометрии (pack, grid или place) во время создания виджета - плохая практика, которой следует избегать.

Здесь Вот как должен выглядеть последний блок кода:

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

В результате появится окно с меткой внизу. Если вы хотите, чтобы это было вверху, измените порядок, в котором вы упаковываете элементы во фрейме, и / или явно укажите, где они должны быть go:

label.pack(side="top", fill="x")
canvas.pack(side="bottom", fill="both", expand=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...