在Tkinter中创建向导

3
我正在使用Tkinter创建向导(Wizard)。在几乎每个步骤中,我都需要相同的页脚,包含用于导航和取消的按钮。我应该怎样实现这个功能呢?我需要创建一个框架(Frame)吗?通常情况下,所有步骤都应该创建为不同的框架(Frame)吗?

不是很清楚,您能详细说明一下您的向导是如何构建的,界面是什么样子的,还有页脚的作用是什么?按钮的功能已经通过它们的标题变得很明显了。 - Jacob Vlijm
1
请参考以下链接:在tkinter中切换两个框架。它使用Frame来创建Pages - 您可以以相同的方式使用Frame或使用Frame创建带有按钮(和其他元素的位置)的小部件,然后使用此小部件构建Pages - furas
2个回答

2
这个问题的答案与 在tkinter中切换两个帧 没有太大的区别。唯一的显著区别是您想要一个永久性的按钮集合在底部,但在那里没有特殊的事情要做 - 只需创建一个带有一些按钮的框架作为保存单个页面(或步骤)的小部件的同级即可。

我建议为每个向导步骤创建一个单独的类,该类继承自 Frame。然后只需要删除当前步骤的帧并显示下一步骤的帧即可。

例如,一个步骤可能如下所示(使用Python 3语法):

class Step1(tk.Frame):
    def __init__(self, parent):
        super().__init__(parent)

        header = tk.Label(self, text="This is step 1", bd=2, relief="groove")
        header.pack(side="top", fill="x")

        <other widgets go here>

其他步骤在概念上是相同的:一个带有一堆小部件的框架。

你的主程序或Wizard类将根据需要实例化每个步骤,或者提前实例化它们全部。然后,你可以编写一个方法,该方法以步骤编号作为参数,并相应地调整UI。

例如:

class Wizard(tk.Frame):
    def __init__(self, parent):
        super().__init__(parent)

        self.current_step = None
        self.steps = [Step1(self), Step2(self), Step3(self)]

        self.button_frame = tk.Frame(self, bd=1, relief="raised")
        self.content_frame = tk.Frame(self)

        self.back_button = tk.Button(self.button_frame, text="<< Back", command=self.back)
        self.next_button = tk.Button(self.button_frame, text="Next >>", command=self.next)
        self.finish_button = tk.Button(self.button_frame, text="Finish", command=self.finish)

        self.button_frame.pack(side="bottom", fill="x")
        self.content_frame.pack(side="top", fill="both", expand=True)

        self.show_step(0)

    def show_step(self, step):

        if self.current_step is not None:
            # remove current step
            current_step = self.steps[self.current_step]
            current_step.pack_forget()

        self.current_step = step

        new_step = self.steps[step]
        new_step.pack(fill="both", expand=True)

        if step == 0:
            # first step
            self.back_button.pack_forget()
            self.next_button.pack(side="right")
            self.finish_button.pack_forget()

        elif step == len(self.steps)-1:
            # last step
            self.back_button.pack(side="left")
            self.next_button.pack_forget()
            self.finish_button.pack(side="right")

        else:
            # all other steps
            self.back_button.pack(side="left")
            self.next_button.pack(side="right")
            self.finish_button.pack_forget()

nextbackfinish 函数的定义非常简单:只需调用 self.show_step(x),其中 x 是要显示的步骤号。例如,next 函数可能看起来像这样:

def next(self):
    self.show_step(self.current_step + 1)

谢谢,关于以下问题:1)页脚,几乎所有步骤都应该共享吗?2)我应该在哪里创建root = Tk() - Jodooomi
@Jodooomi:"footer" 是 self.button_frame。您可以在其中放置任何想要的内容,或创建多个页脚、页眉或任何您想要的东西。您可以像通常一样在任何时间/地点创建根窗口。 - Bryan Oakley
是的,在哪里通常应该创建根目录呢?你能给我展示一下吗?在“主要函数”中吗? - Jodooomi
你能给我一个例子,展示一下如何使用你的解决方案吗? - Jodooomi
在MainApplication中“create the rest of your gui here”的位置添加以下一行代码:Wizard(self).pack(fill="both", expand=True)。好的,我应该在哪里加上"root = Tk()"呢?我已经问了几次了! - Jodooomi
显示剩余9条评论

0
我建议使用一个主窗口与按钮,并将其余的小部件放置在不同的 labelframe 中,这些 labelframe 在按钮执行不同函数时出现和消失。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接