#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
, поскольку это то, что используют другие виджеты в классе.