根据Bryan Oakley对这篇文章的回答Best way to structure a tkinter application?,我想将tab1的内容移动到它自己的类中,但是让say_hello和get_item保持原样。我该怎么做
import tkinter as tk
from tkinter import ttk, N, S, END, EXTENDED
class MainApplication(tk.Frame):
def __init__(self, root, *args, **kwargs):
tk.Frame.__init__(self, root, *args, **kwargs)
self.root = root
self.nb = ttk.Notebook(root)
self.tab1 = ttk.Frame(self.nb)
self.tab2 = ttk.Frame(self.nb)
self.nb.add(self.tab1, text='TAB1')
self.nb.add(self.tab2, text='TAB2')
self.nb.grid(row=0, column=0)
#contents of tab1 - which I would like to place in their own class
self.frame = tk.Frame(self.tab1)
self.frame.grid(row=0, column=0)
self.button = tk.Button(self.frame, text='Hello', command=self.say_hello)
self.button.grid(row=0, column=0)
self.items = ['A','B','C']
self.listbox = tk.Listbox(self.frame, selectmode=EXTENDED, exportselection=0)
self.listbox.grid(row=1, column=0)
self.scrollbar = tk.Scrollbar(self.frame, orient='vertical')
self.scrollbar.grid(row=1, column=1, sticky=N+S)
self.listbox.config(yscrollcommand=self.scrollbar.set)
self.scrollbar.config(command=self.listbox.yview)
self.listbox.bind('<<ListboxSelect>>', self.get_item)
for item in self.items:
self.listbox.insert(END, item)
#contents of tab2 - which should be in their own class
#...
#...
def say_hello(self):
print('hello')
def get_item(self, evt):
w = evt.widget
index = int(w.curselection()[0])
print('item selected = {}'.format(self.items[index]))
if __name__ == "__main__":
root = tk.Tk()
MainApplication(root)
root.mainloop()
编辑:
感谢萨阿德的详细回复。我运行了你的代码,研究了它,学到了很多东西。然而,我修改了我的问题,使其更加集中
据我所说,我认为每个人都有自己的写作风格,组织他们的文件和课程。我组织代码的方式可能不是最好的。但我会尽我最大的努力使它更有条理,更简单。尽管没有关于如何组织Tkinter应用程序的硬性规定。但是,是的,OOP是组织大型项目的最佳方式,因为它们使代码更小,更容易理解
您可以在一个单独的文件(tab1.py,tab2.py,…)中为每个选项卡
(Tab1, Tab2, ..)
创建一个类,但我更希望将所有选项卡都放在一个名为tabs.py的文件中。这样我就可以像这样导入它们请仔细阅读代码中的每条注释和我的观点,以获得您的大部分答案。
我已将您的代码分为4部分
首先,我为所有选项卡创建了一个基本框架类在这个基本框架类中,我们可以配置所有选项卡共同需要的东西。例如,假设您希望每个选项卡中都有一个具有背景颜色浅黄色的框架。因此,您可以创建一个基类,并将其作为baseframe.py放在一个单独的文件中。就像这样
我认为一个CustomListbox类会很好,你可以很有创造性地创建这个类,但我保持它的简单性。我在CustomListbox类中添加了一个滚动条,并对其进行了配置
您可以为此创建文件customlistbox.py。或者将baseframe.py的名称更改为basewidgets.py,并将
BaseFrame
和CustomListbox
保存在一个文件中请参见选项卡类中的如何使用它
这里是tabs.py文件
最后是main.py文件。您可以在这里导入选项卡(
import tabs
)。我根据自己的意愿组织了MainApplication
课程。例如,我没有为选项卡创建每个实例(self.tab1,self.tab2,…),而是创建了一个列表self.tabs
来包含所有选项卡,这更便于通过self.tabs
的index
访问希望这能让你明白很多事情
相关问题 更多 >
编程相关推荐