【发布时间】:2018-02-08 20:10:18
【问题描述】:
我正在尝试从这里的答案/问题中复制我自己的答案:Switch between two frames in tkinter
正如你从上面的答案中看到的那样,它实例化了 Frame 小部件的多个子类,当我们想要切换页面时,我们单击一个按钮,该类是我们基类中的一个方法。
但是,在“页面”类下创建多个“页面”方法不是更干净且有意义吗?我不确定该相信什么,我很想澄清一下我应该如何处理这个项目,以及为什么使用类或实例化方法会更好?
我已将我的 cmets 添加到下面的代码中,用于我不太理解的行,我希望我能从 StackOverflow 的世界中获得一些知识。
import Tkinter as tk
LARGE_FONT = ("Verdana", 12)
class Main(tk.Tk):
def __init__(self, *args, **kwargs):
########### are we calling the Tk class from tkinter and passing in our 'Main' class?
tk.Tk.__init__(self, *args, **kwargs)
# why not self.container?
container = tk.Frame(self)
# again, should I be using self.page here instead?
page = Pages(parent=container, controller=self)
container.pack(side="top", fill="both", expand=True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
self.frames = {}
for F in ('page.page_one()', 'page.page_two()'):
# what exactly does __name__ do? And how can I replicate this with my derived classes instanced methods?
page_name = F#F.__name__
frame = page#(parent=container, controller=self)
self.frames[page_name] = frame
frame.grid(row=0, column=0, sticky='nsew')
self.show_frame("page.page_one()")
def show_frame(self, page_name):
frame = self.frames[page_name]
frame.tkraise()
class Pages(tk.Frame):
# i could just use *args, **kwargs here couldn't I?
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
self.page_one(controller)
# here I have my instance methods inside my derived 'Pages' class
# isn't this much cleaner, having multiple instance methods inside a class?
# or I should be separating each page into it's own instanced class?
def page_one(self, controller):
label = tk.Label(self, text='show_firmware_page', font=LARGE_FONT)
label.pack(pady=10, padx=10)
# how can I switch pages using the next button?
next_btn = tk.Button(self, text='Next', command=lambda: controller.show_frame(self.page_two(controller)))
quit_btn = tk.Button(self, text='Quit', command=lambda: controller.show_frame())
quit_btn.pack()
next_btn.pack()
def page_two(self, controller):
label = tk.Label(self, text='second_page', font=LARGE_FONT)
label.pack(pady=10, padx=10)
# how can I switch pages using the next button?
next_btn = tk.Button(self, text='Next', command=lambda: Pages.show_frame("page_one"))
quit_btn = tk.Button(self, text='Quit', command=lambda: Pages.show_frame())
quit_btn.pack()
next_btn.pack()
app = Main()
app.mainloop()
基本上,我目前的工作是尝试在我的类中使用方法来定义我的页面并在它们之间切换。我目前遇到了一些麻烦,看了其他人的答案后,很多人都认为每个类都实例化一个 Frame,我们在其中调用一个方法来在这些实例之间切换。
让我知道你对这个过程的想法,让我快速了解我应该如何处理这个项目。
非常感谢您的帮助 - 我真的很想把这些面向对象的东西记下来。
【问题讨论】:
-
IMO 试图通过使用 tkinter 来学习 OOP 可能不是一个好方法,因为其中的对象经常不像常规的 Python 类和它们的实例那样表现。这是因为它只不过是 Tk GUI 工具包的一个接口,虽然它有类和实例,但它们的行为通常与用纯 Python(或 C++、Java 等)编写时的行为方式不同.
-
@martineau 谢谢。我想我应该对这个问题做的就是把它吸起来,采用多类方法,一旦我完全掌握了 OOP 并尝试实现页面方法而不是类,稍后再重新审视这个项目。我只是不确定哪个是更“pythonic”的方式,如果你愿意的话,可以为这个项目实现类而不是方法,反之亦然。
标签: python python-2.7 class oop methods