在Tkinter中创建向导

时间:2016-12-26 14:57:01

标签: python python-3.x tkinter

我在Tkinter中创建了一个向导。我几乎每个步骤都有相同的页脚,按钮用于导航和取消。我怎样才能做到这一点?我应该创建一个框架吗?一般来说,是否应将所有步骤创建为不同的框架?

2 个答案:

答案 0 :(得分:2)

这个问题的答案与Switch between two frames in 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) 可能如下所示:

$ help if
if: if COMMANDS; then COMMANDS; [ elif COMMANDS; then COMMANDS; ]...
[ else COMMANDS; ] fi

答案 1 :(得分:0)

我建议使用一个带有按钮的主窗口,并将其余小部件放在不同的标签框中,这些标签在通过按钮执行不同功能时会出现或消失