Python GUI类框架

时间:2014-07-01 20:39:08

标签: python user-interface tkinter

我制作了一个程序,用于框架打开新的"页面"。在第135行,我想在antmengen.get()==0等时打开课程。但它不起作用。我没有错误,新页面没有出现。我如何打开"课程?感谢。

        import tkinter as tk
    from tkinter import *
    import random

    class SampleApp(tk.Tk):
        def __init__(self, *args, **kwargs):
            tk.Tk.__init__(self, *args, **kwargs)

            container= tk.Frame(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 (fenster, auswahl, information1, information2, mode1, mode2, scale0, scale1):
                frame= F(container, self)
                self.frames[F]=frame
                frame.grid(row=0, column=0, sticky="nsew")

            self.show_frame(fenster)

        def show_frame(self, c):
            frame=self.frames[c]
            frame.tkraise()

    class fenster(tk.Frame):
        def __init__(self, parent, controller):
            tk.Frame.__init__(self, parent)

            label=tk.Label(self, text="Das ist die Startseite")
            label.pack(side="top", fill="x", pady=10)

            button=tk.Button(self, text="Start",
                             command=lambda: controller.show_frame(auswahl))
            button.pack()

    class auswahl(tk.Frame):
        def __init__(self, parent, controller):
            tk.Frame.__init__(self, parent)

            infbutton1=tk.Button(self, text="Information zu 1",
                                 command=lambda: controller.show_frame(information1))
            infbutton1.pack()

            infbutton2=tk.Button(self, text="Information zu 2",
                                 command=lambda: controller.show_frame(information2))
            infbutton2.pack()

            mode1button=tk.Button(self, text="Modus 1",
                                  command=lambda: controller.show_frame(mode1))
            mode1button.pack()

            mode2button=tk.Button(self, text="Modus 2",
                                  command=lambda: controller.show_frame(mode2))
            mode2button.pack()


    class information1(tk.Frame):
        def __init__(self, parent, controller):
            tk.Frame.__init__(self, parent)
            label=tk.Label(self, text="In diesem Modus gibt es 5 schon vorgegebene Antworten, die auf Ihre Fragen 'antworten'!")
            label.pack(side="top", fill="x", pady=10)
            button=tk.Button(self, text="Zurück",
                             command=lambda: controller.show_frame(auswahl))
            button.pack()

    class information2(tk.Frame):
        def __init__(self, parent, controller):
            tk.Frame.__init__(self, parent)
            label=tk.Label(self, text="In diesem Modus gibt es 5 schon vorgegebene Antworten, die auf Ihre Fragen 'antworten'!")
            label.pack(side="top", fill="x", pady=10)
            button=tk.Button(self, text="Zurück",
                             command=lambda: controller.show_frame(auswahl))
            button.pack()

    class mode1(tk.Frame):
        def __init__(self, parent, controller):
            tk.Frame.__init__(self, parent)
            label=tk.Label(self, text= "Stellen Sie eine beliebige Frage. Wenn Sie bereit sind drücken Sie auf 'OK'")   #Text1/Label für mode1
            label.pack(side="top", fill="x", pady=10)
            def ok():
                a=random.randint(1,5)
                if a==1:
                    label=Label(text="Ja")            #Label antworten für mode1
                    label.pack(side="top", fill="x", pady=10)
                elif a==2:
                    label=Label(text="Nein")
                    label.pack(side="top", fill="x", pady=10)
                elif a==3:
                    label=Label(text="Vielleicht")
                    label.pack(side="top", fill="x", pady=10)
                elif a==4:
                    label=Label(text="Auf jeden Fall")
                    label.pack(side="top", fill="x", pady=10)
                elif a==5:
                    label=Label(text="Auf keinen Fall")
                    label.pack(side="top", fill="x", pady=10)

            okknopf=Button(self, text="OK", command=ok)  #Der ok-Knopf
            okknopf.pack()

            button=tk.Button(self, text="Zurück",
                             command=lambda: controller.show_frame(auswahl))
            button.pack()

    class mode2(tk.Frame):
        def __init__(self, parent, controller):
            tk.Frame.__init__(self, parent)

            label=Label(self, text="Suchen Sie sich aus, wie viele Wörter Sie haben möchten!")
            label.pack()

            def antmenge(self):
                mant["text"]="Mögliche Antworten: " \
                    + str(antmengen.get()) + " "

            mant=Label(self, text="Mögliche Antworten: 0 Wörter", width=25)
            mant.pack()

            antmengen=IntVar()
            antmengen.set(0)

            antm=Scale(self, width=20, length=200, orient="vertical", from_=0, to=1,
            resolution=1, tickinterval=10, label="Wörter", command=antmenge(self),
            variable=antmengen)
            antm.pack()

            button=tk.Button(self, text="Zurück",
                             command=lambda: controller.show_frame(auswahl))
            button.pack()

            button1=tk.Button(self, text="Ok", command=antmenge(self))
            button1.pack()

            if antmengen.get()==0:
                    scale0(parent, controller)

            elif antmengen.get()==1:
                    scale1(parent, controller)

    class scale0(tk.Frame):
        def __init__(self, parent, controller):
            tk.Frame.__init__(self, parent)
            label=tk.Label(self, text="Es muss mindestens eine Antwort sein")
            label.pack(side="top", fill="x", pady=10)
            button=tk.Button(self, text="Zurück",
                             command=lambda: controller.show_frame(mode2))
            button.pack()

    class scale1(tk.Frame):
        def __init__(self, parent, controller):
            tk.Frame.__init__(self, parent)
            label=tk.Label(self, text="Wort1")
            label.pack(side="top", fill="x", pady=10)
            wort1auf=Entry(self)
            wort1auf.pack()
            def ok3():     
                a=random.randint(1,1)
                if a==1:
                    label2ant1=Label(self, text=" ")            #Label antworten für mode1
                    label2ant1.pack()
                    def wort1aufein():
                        label2ant1.configure(text=(wort1auf.get()))
                    wort1aufein()
            button1=Button(self, text="Antworten", command=ok3)
            button1.pack()

            button=tk.Button(self, text="Zurück",
                             command=lambda: controller.show_frame(mode2))
            button.pack()


    if __name__== "__main__":
        app=SampleApp()
        app.mainloop()

2 个答案:

答案 0 :(得分:0)

我在print之后添加if antmengen.get()==0:,所以我看到在启动程序后立即调用if antmengen.get()==0:

我认为你必须重新设计节目,因为:

-

如果我添加.grid()

scale0(parent, controller).grid()

然后我用Start按钮在框架中得到这个框架。

-

如果我添加.pack()并将parent更改为self

scale0(self, controller).pack()

然后我立即在Scale窗口小部件的框架内得到这个框架。

答案 1 :(得分:0)

问题是你正在创建比例的实例,但是你没有将它添加到窗口。

看看这一行:

if antmengen.get()==0:
    scale0(parent, controller)

在这里,您要创建scale0的实例,它是框架的子类。但是,您无法在此实例上致电packgridplace。由于parent中的其他小部件使用网格,您应该执行以下操作:

if antmengen.get()==0:
    s=scale0(parent, controller)
    s.grid(...)

你将它作为一个类的一部分创建它似乎很奇怪,但是给它一个除了类之外的父窗口小部件,所以也许另一个错误是第一个参数应该是self而不是{{1} }。如果您将父级更改为parent,则需要从self切换到grid,因为这是该类中其他小部件使用的内容。