日安,
使用tkinter,Python3.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()
但是,当我添加第二个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)
#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
发布于 2020-01-20 02:46:39
在对其他有类似问题的人进行了更多小时的研究和@jasonharper评论之后,我发现我需要在创建时将frame ID保存(附加)到一个列表中,以确保每个小部件保持唯一。
下面的代码完成了我希望它做的事情:
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
https://stackoverflow.com/questions/59807288
复制相似问题