Вложенные рамки в ткинтер - PullRequest
       37

Вложенные рамки в ткинтер

0 голосов
/ 19 января 2020

Good Day,

Используя tkinter, Python 3.5 Я пытаюсь создать вложенные кадры, используя циклы for и списки для генерации имен кадров. Это работает для первого уровня кадров в кадре, однако следующий уровень не выполняется.

Например, этот код работает:

from tkinter import *
from tkinter import ttk

frameLevel1List = ['Frame1', 'Frame2', 'Frame3', 'Frame4']
frameLevel2List = ['FrameA', 'FrameB', 'FrameC', 'FrameD']

class myUI:
    def __init__(self):
        #create main window & frames
        self.main_window = Tk()
        self.main_window.title("frame2 UI V001 ")
        self.main_window.configure(background='gray')
        w=750
        h=500
        x=100
        y=100
        self.main_window.geometry("%dx%d+%d+%d" % (w, h, x, y))
        self.userlabel = Label(self.main_window, bg='gray', fg='white', text = "user Label")
        self.userlabel.pack(side="top")
        self.levellabel = Label(self.main_window, bg='gray', fg='white', text = "level Label")
        self.levellabel.pack(side="top")

        #create bottom frame
        bottomFrame = Frame(self.main_window, bg='white', height=500, width=800)
        bottomFrame.pack(side=BOTTOM)

        #create frames from first list
        for frame in frameLevel1List:
            self.frame=Frame(bottomFrame, width=800, height = 100, bg = 'green',  highlightbackground="black", highlightcolor="black", highlightthickness="1")
            self.frame.pack(side="top")
            self.framelabel = Label(self.frame, bg='blue', fg='white', text = frame)
            self.framelabel.place(x=10, y=10)


        mainloop()

UI=myUI()

Однако, когда я добавляю секунду для l oop добавить второй список кадров в каждом из первых кадров, я получаю сообщение об ошибке. Следующий код терпит неудачу

from tkinter import *
from tkinter import ttk

frameLevel1List = ['Frame1', 'Frame2', 'Frame3', 'Frame4']
frameLevel2List = ['FrameA', 'FrameB', 'FrameC', 'FrameD']

class myUI:
    def __init__(self):
        #create main window & frames
        self.main_window = Tk()
        self.main_window.title("frame2 UI V001 ")
        self.main_window.configure(background='gray')
        w=750
        h=500
        x=100
        y=100
        self.main_window.geometry("%dx%d+%d+%d" % (w, h, x, y))
        self.userlabel = Label(self.main_window, bg='gray', fg='white', text = "user Label")
        self.userlabel.pack(side="top")
        self.levellabel = Label(self.main_window, bg='gray', fg='white', text = "level Label")
        self.levellabel.pack(side="top")

        #create bottom frame
        bottomFrame = Frame(self.main_window, bg='white', height=500, width=800)
        bottomFrame.pack(side=BOTTOM)

        #create frames from first list
        for frame in frameLevel1List:
            self.frame=Frame(bottomFrame, width=800, height = 100, bg = 'green',  highlightbackground="black", highlightcolor="black", highlightthickness="1")
            self.frame.pack(side="top")
            self.framelabel = Label(self.frame, bg='blue', fg='white', text = frame)
            self.framelabel.place(x=10, y=10)

            #create frames from second list
            for frame2 in frameLevel2List:
                self.frame2=Frame(frame, width=800, height = 50, bg = 'yellow')
                self.frame2.pack(side="top")
                self.frame2label = Label(self.frame2, bg='blue', fg='white', text = frame2)
                self.frame2label.place(x=10, y=10)

        mainloop()

UI=myUI()

Вот сообщение об ошибке:

Traceback (most recent call last):
  File "C:\Users\Nicholas Boughen\Desktop\py\rubrics\nestedFramesTest.py", line 43, in <module>
    UI=myUI()
  File "C:\Users\Nicholas Boughen\Desktop\py\rubrics\nestedFramesTest.py", line 36, in __init__
    self.frame2=Frame(frame, width=800, height = 50, bg = 'yellow')
  File "C:\Users\Nicholas Boughen\AppData\Local\Programs\Python\Python35\lib\tkinter\__init__.py", line 2584, in __init__
    Widget.__init__(self, master, 'frame', cnf, {}, extra)
  File "C:\Users\Nicholas Boughen\AppData\Local\Programs\Python\Python35\lib\tkinter\__init__.py", line 2132, in __init__
    BaseWidget._setup(self, master, cnf)
  File "C:\Users\Nicholas Boughen\AppData\Local\Programs\Python\Python35\lib\tkinter\__init__.py", line 2110, in _setup
    self.tk = master.tk
AttributeError: 'str' object has no attribute 'tk'

Все, что могло бы помочь мне понять, что я сделал неправильно, и создать вложенные фреймы с циклами for, было бы наиболее ценно .

Возможно, существует совершенно другой способ процедурного создания вложенных кадров, который был бы лучше? Я пытаюсь создать имена фреймов из списка и изменять интерфейс по мере изменения списка. Поэтому, если в списке больше или меньше элементов, в интерфейсе будет больше или меньше кадров. Список будет редактироваться из другого интерфейса.

lor

1 Ответ

0 голосов
/ 19 января 2020

После долгих часов исследования других людей, у которых были подобные проблемы, и комментария @jasonharper, я обнаружил, что мне нужно сохранять (добавлять) идентификатор кадра в список по мере его создания, чтобы каждый виджет оставался уникальным.

Вот код, который делает то, что я хочу:

from tkinter import *
import functools

class practice:
    def __init__(self,root):
        self.frame_list = []


        for w in range(5):
            frame = Frame(root, width=800, height = 100, bg = 'green',  highlightbackground="black", highlightcolor="black", highlightthickness="1")
            frame.pack(side="top")
            self.frame_list.append(frame)

            for w in range(5):
                frame = Frame(root, width=400, height = 50, bg = 'blue',  highlightbackground="black", highlightcolor="black", highlightthickness="1")
                frame.pack(side="top")
                self.frame_list.append(frame)

                for w in range(5):
                    frame = Frame(root, width=200, height = 25, bg = 'yellow',  highlightbackground="black", highlightcolor="black", highlightthickness="1")
                    frame.pack(side="top")
                    self.frame_list.append(frame)


        print('button list is', self.frame_list)



root = Tk()
root.title("frame2 UI V001 ")
root.configure(background='gray')
w=750
h=500
x=100
y=100
root.geometry("%dx%d+%d+%d" % (w, h, x, y))

Спасибо, я постараюсь в будущем публиковать вопросы с большей ясностью.

lor

...