首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >tkinter中的嵌套框架

tkinter中的嵌套框架
EN

Stack Overflow用户
提问于 2020-01-19 12:59:54
回答 1查看 192关注 0票数 0

日安,

使用tkinter,Python3.5,我正在尝试使用for循环和列表来创建嵌套框架,以生成框架名称。这适用于帧中的第一级帧,但下一级失败。

例如,下面的代码可以工作:

代码语言:javascript
运行
复制
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()

但是,当我添加第二个for循环来在每个第一个帧中添加第二个帧列表时,我得到了一个错误。以下代码失败

代码语言:javascript
运行
复制
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()

以下是错误消息:

代码语言:javascript
运行
复制
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

EN

Stack Overflow用户

发布于 2020-01-20 02:46:39

在对其他有类似问题的人进行了更多小时的研究和@jasonharper评论之后,我发现我需要在创建时将frame ID保存(附加)到一个列表中,以确保每个小部件保持唯一。

下面的代码完成了我希望它做的事情:

代码语言:javascript
运行
复制
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

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59807288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档