我正在努力理解具体的概念和编码。一些友善的成员给了我一些指导,但是他们的代码超出了我的理解。如果有人可以为我更正此代码,那么至少我会理解并克服这一部分。我确实了解没有tkinter的另一个类的基本类访问方法,但是有了tkinter,我感到困惑。
如果我在一堂课上做所有事情,那么所有代码都可以工作。用#表示,表示我正在尝试自己。我什至通过执行一条print语句来确保self.lower_tabs_dict被正确加载。为了提高编程水平,我想使用更多的课程,当我进入“课堂周”时,会出现错误
self.button = tk.Button(self.lower_tabs_dict["Week 1"], text="test
button", bg="salmon",)
AttributeError: 'Week' object has no attribute 'lower_tabs_dict'
...这告诉我我没有正确访问该变量。我该怎么做?再次谢谢你。
import tkinter as tk
from tkinter import ttk
class Application(tk.Frame): #inherent from frame.
def __init__(self, parent):
tk.Frame.__init__(self, parent, bg="tan")
self.parent = parent
self.pack()
self.lower_tabs = ["Week 1", "Week 2",]
self.lower_tabs_dict = {}
self.buttons_dict = {}
self.GUI()
def GUI(self): #the function that runs all the GUI functions.
self.week1 = Week()
self.create_lower_tabs()
####---------create grid_GUI---------------------####
def create_lower_tabs(self):
style1 = ttk.Style()
style1.configure("down.TNotebook", tabposition = "sw")
self.tabControl_lower = ttk.Notebook(self, width=1100,
height=550, padding = 0, style = "down.TNotebook" )
for name in self.lower_tabs:
self.tab=tk.Frame(self.tabControl_lower, bg='old lace')
self.tabControl_lower.add(self.tab, text=name, )
self.lower_tabs_dict[name] = self.tab
self.tabControl_lower.pack(fill=tk.BOTH, expand=1)
#print (self.lower_tabs_dict["Week 1"])
#print (self.lower_tabs_dict["Week 2"])
#for name in self.lower_tabs:
#self.button = tk.Button(self.lower_tabs_dict[name], text =
#"Calculate")
#self.buttons_dict[name] = self.button
#self.button.pack()
class Week(tk.Frame):
def __init__(self, parent,):
tk.Frame.__init__(self, parent)
self.parent = parent
self.pack()
self.button = tk.Button(self.lower_tabs_dict["Week 1"],
text="test button", bg="salmon",)
self.button.pack()
self.button = tk.Button(self.lower_tabs_dict["Week 2"], text =
"this page 2 button", bg = "salmon")
self.button.pack()
def main():
root = tk.Tk()
root.title("class basic window")
root.config(background="LightBlue4")
app = Application(root)
root.mainloop()
if __name__ == '__main__':
main()
答案 0 :(得分:1)
有两个问题使您的代码无法在此处工作。
第一个是您呼叫Week
的顺序。创建选项卡之前,请尝试创建Week
类。
2,您需要将自己从Application类传递给Week
。这是必需的,因此Week
可以访问Application
的类属性。
在这里,您需要对代码进行一些清理,而我重编了create_lower_tabs
方法,因为创建每个选项卡的方式有点不合常规和不必要。
import tkinter as tk
from tkinter import ttk
class Application(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent, bg="tan")
self.parent = parent
self.pack()
self.lower_tabs = ["Week 1", "Week 2"]
self.lower_tabs_dict = {}
self.buttons_dict = {}
self.create_lower_tabs()
self.week1 = Week(self)
self.week1.pack()
def create_lower_tabs(self):
style1 = ttk.Style()
style1.configure("down.TNotebook", tabposition="sw")
self.tab_control_lower = ttk.Notebook(self, width=1100, height=550, padding=0, style="down.TNotebook")
for name in self.lower_tabs:
self.lower_tabs_dict[name] = tk.Frame(self.tab_control_lower, bg='old lace')
self.tab_control_lower.add(self.lower_tabs_dict[name], text=name)
self.tab_control_lower.pack(fill=tk.BOTH, expand=1)
class Week(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
self.parent = parent
tk.Button(self.parent.lower_tabs_dict["Week 1"], text="test button", bg="salmon",).pack()
tk.Button(self.parent.lower_tabs_dict["Week 2"], text="this page 2 button", bg="salmon").pack()
def main():
root = tk.Tk()
root.title("class basic window")
root.config(background="LightBlue4")
Application(root)
root.mainloop()
if __name__ == '__main__':
main()
因此,我真的认为您应该从Tk()
继承而不是Application
类的Frame,因为它将成为您的主窗口。
import tkinter as tk
from tkinter import ttk
class Application(tk.Tk):
def __init__(self):
super().__init__()
self.title("class basic window")
self.config(background="LightBlue4")
self.lower_tabs = ["Week 1", "Week 2"]
self.lower_tabs_dict = {}
self.buttons_dict = {}
self.create_lower_tabs()
self.week1 = Week(self)
self.week1.pack()
def create_lower_tabs(self):
style1 = ttk.Style()
style1.configure("down.TNotebook", tabposition="sw")
self.tab_control_lower = ttk.Notebook(self, width=1100, height=550, padding=0, style="down.TNotebook")
for name in self.lower_tabs:
self.lower_tabs_dict[name] = tk.Frame(self.tab_control_lower, bg='old lace')
self.tab_control_lower.add(self.lower_tabs_dict[name], text=name)
self.tab_control_lower.pack(fill=tk.BOTH, expand=1)
class Week(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
self.parent = parent
tk.Button(self.parent.lower_tabs_dict["Week 1"], text="test button", bg="salmon",).pack()
tk.Button(self.parent.lower_tabs_dict["Week 2"], text="this page 2 button", bg="salmon").pack()
if __name__ == '__main__':
Application().mainloop()
答案 1 :(得分:0)
tkinter类与任何其他类型的python类之间绝对没有区别。在这种情况下,您要先在字典中使用元素,然后再创建该元素。字典中是否包含小部件或其他任何内容都没有关系,您不能在它存在之前引用它。
具体地说,在self.lower_tabs_dict["Week 1"]
中创建了create_lower_tabs
。您在Week.__init__
中引用了它,但是在调用Week
之前创建了create_lower_tabs
的实例。