Фреймы класса графического интерфейса Python

#python #user-interface #tkinter

#python #пользовательский интерфейс #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()
  

Комментарии:

1. Распечатайте antmengen.get() , чтобы увидеть, что вы получите.

2. Где находится строка 135 в этом коде?

3. Вы можете «открыть» класс. Вы можете создать экземпляр класса или запустить функцию некоторого экземпляра класса.

4. Существует правило: первая буква имени класса должна быть заглавной — см. Label , Entry , Button — так легче распознать класс в коде

Ответ №1:

Я добавляю print после if antmengen.get()==0: , поэтому я вижу, что if antmengen.get()==0: вызывается сразу после запуска программы.

Я думаю, вам нужно перепроектировать программу, потому что:

Если я добавлю .grid()

 scale0(parent, controller).grid()
  

затем я получаю этот фрейм в кадре с Start кнопкой.

Если я добавлю .pack() и изменю parent в self

 scale0(self, controller).pack()
  

затем я сразу получаю этот фрейм в кадре с Scale виджетом.

Ответ №2:

Проблема в том, что вы создаете экземпляр шкалы, но не добавляете его в окно.

Взгляните на эту строку:

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

Здесь вы создаете экземпляр scale0 , который является подклассом frame. Однако вы никогда не вызываете pack or grid или place в этом экземпляре. Поскольку другие виджеты в parent используют сетку, вы должны сделать что-то вроде этого:

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

Кажется странным, что вы создаете его как часть класса, но предоставляете ему родительский виджет, отличный от класса, поэтому, возможно, другая ошибка заключается в том, что первый аргумент должен быть self , а не parent . Если вы измените родительское значение на self , вам нужно переключиться с grid на pack , поскольку это то, что используют другие виджеты в классе.