2017-08-31 2 views
2

Ich bin ein Student, und als Anfänger, weiß ich nicht viel von Python. Ich habe mich jedoch entschieden, ein Multiple-Choice-Quiz zu machen, bei dem keine Antwort falsch ist, aber alle Antworten ergeben eine Gesamtpunktzahl. Ich habe jede Frage Seite in eine eigene Klasse, wie Klasse Frage1 (tk.Frame): gelegt. Ein Teil des Codes, den ich benutzt habe, ist aus dem Internet ...Python 2.7, Tkinter Multiple-Choice-Quiz (Notebook-Layout und Radio-Button-Hilfe)

Meine erste Frage ist, wie bekomme ich jede Klasse zu einem eigenen Rahmen (frame_1, frame_2, etc ...), so dass ich verwenden kann es im Notebook-Layout?

Meine zweite Frage ist, wie bekomme ich Werte aus dem Radio-Button (Wert = 1, etc ...), um eine mögliche .csv-Datei zu speichern, zu speichern? Nichts in meinen Gedanken funktioniert ...

Hilfe wäre sehr geschätzt !!!

from Tkinter import * 
import ttk 
import Tkinter as tk 

LARGE_FONT= ("Arial", 12) 

def sel(): 
      selection = "You selected " + str(var.get()) 
      label.config(text = selection) 

#def answerout(): 

root = tk.Tk() 
var = tk.IntVar() 
notebook = ttk.Notebook(root) 
frame_1 = ttk.Frame(notebook) 
frame_2 = ttk.Frame(notebook) 
frame_3 = ttk.Frame(notebook) 
frame_4 = ttk.Frame(notebook) 
notebook.add(frame_1, text='Home') 
notebook.add(frame_2, text='Question 1') 
notebook.add(frame_3, text='Question 2') 
notebook.add(frame_4, text='Question 3') 
notebook.pack(expand=1, fill="both") 

class Home(tk.Frame): 
    frame1 = Frame(frame_1) 
    frame1.pack(side=TOP) 
    def __init__(root, parent, controller): 
     frame1 = Frame(frame_1) 
     frame1.pack(side=TOP) 
     tk.Frame.__init__(root,parent) 
     label = tk.Label(root, text="This program tries to understand characteristic features of individual students.", font=LARGE_FONT) 
     label1 = tk.Label(root, text="Please click start to begin!", font=LARGE_FONT) 
     label.pack(pady=10,padx=10) 
     label1.pack(pady=10,padx=10) 
     button = tk.Button(root, text="Start!", 
          command=lambda: controller.show_frame(Question1)) 
     button.pack() 
     button2 = tk.Button(root, text="Exit", 
          command=lambda: app.destroy()) 
     button2.pack() 

class Question1(tk.Frame): 
    def __init__(root, parent, controller): 
     tk.Frame.__init__(root, parent) 
     label1 = tk.Label(root, text="I make choices based on what I think, not on what I feel.", font=LARGE_FONT) 
     label1.pack(pady=10,padx=10) 
     R1 = Radiobutton(root, text="Not Often", variable=var, value=1, 
        command=sel) 
     R1.pack(anchor = W) 

     R2 = Radiobutton(root, text="Sometimes", variable=var, value=2, 
        command=sel) 
     R2.pack(anchor = W) 

     R3 = Radiobutton(root, text="Often", variable=var, value=3, 
        command=sel) 
     R3.pack(anchor = W) 
     button1 = tk.Button(root, text="Back to Home", 
          command=lambda: controller.show_frame(Home)) 
     button1.pack() 
     button2 = tk.Button(root, text="Next", 
          command=lambda: controller.show_frame(Question2)) 
     button2.pack() 

class Question2(tk.Frame): 
    def __init__(root, parent, controller): 
     tk.Frame.__init__(root, parent) 
     label = tk.Label(root, text="I challenge people if I don't think they are right.", font=LARGE_FONT) 
     label.pack(pady=10,padx=10) 
     R4 = Radiobutton(root, text="Not Often", variable=var, value=1, 
        command=sel) 
     R4.pack(anchor = W) 

     R5 = Radiobutton(root, text="Sometimes", variable=var, value=2, 
        command=sel) 
     R5.pack(anchor = W) 

     R6 = Radiobutton(root, text="Often", variable=var, value=3, 
        command=sel) 
     R6.pack(anchor = W) 
     button2 = tk.Button(root, text="Back", 
          command=lambda: controller.show_frame(Question1)) 
     button2.pack() 
     button3 = tk.Button(root, text="Next", 
          command=lambda: controller.show_frame(Question3)) 
     button3.pack() 
     button1 = tk.Button(root, text="Back to Home", 
          command=lambda: controller.show_frame(Home)) 
     button1.pack() 

class Question3(tk.Frame): 
    def __init__(root, parent, controller): 
     tk.Frame.__init__(root, parent) 
     label = tk.Label(root, text="I can change and fit into new situations easily.", font=LARGE_FONT) 
     label.pack(pady=10,padx=10) 
     R7 = Radiobutton(root, text="Not Often", variable=var, value=1, 
        command=sel) 
     R7.pack(anchor = W) 

     R8 = Radiobutton(root, text="Sometimes", variable=var, value=2, 
        command=sel) 
     R8.pack(anchor = W) 

     R9 = Radiobutton(root, text="Often", variable=var, value=3, 
        command=sel) 
     R9.pack(anchor = W) 
     button2 = tk.Button(root, text="Back", 
          command=lambda: controller.show_frame(Question2)) 
     button2.pack() 
     button3 = tk.Button(root, text="Next (GOES HP)", 
          command=lambda: controller.show_frame(Home)) 
     button3.pack() 
     button1 = tk.Button(root, text="Back to Home", 
          command=lambda: controller.show_frame(Home)) 

label = Label(root) 
label.pack() 
app = root 
app.geometry('1024x512') 
app.wm_title('Brain Thinking Model') 
app.iconbitmap(r'fav.ico') 
app.mainloop() 
root.mainloop() 

Antwort

0

Meine erste Frage ist, wie bekomme ich jede Klasse ihren eigenen Rahmen zu werden (Frame_1, frame_2, etc ...), so kann ich es im Notebook-Layout verwenden?

Es gibt nicht viel zu tun, um jede Klasse zu einem Notizbuch zu machen. Sie haben die meiste Arbeit bereits erledigt. Ihre Klassen (Home, Question1 usw.) sind bereits Frames, Sie können sie also direkt verwenden. Sie nehmen jeweils ein controller als ein Argument, so dass Sie erstellen müssen, dann Instanzen der Klasse, und fügen Sie sie dann dem Notizbuch hinzu.

controller = <something you did not include in your question> 

notebook = ttk.Notebook(root) 
frame_1 = Home(notebook, controller) 
frame_2 = Question1(notebook, controller) 
... 
notebook.add(frame_1, text="Home") 
notebook.add(frame_2, text="Question 1") 
... 

Meine zweite Frage ist, wie bekomme ich Werte aus dem Optionsfeld (Wert = 1, etc ...) auf eine mögliche CSV-Datei zu senden gespeichert werden?

Sie benötigen einen Verweis auf die mit dem Radiobutton verknüpfte Variable. Damit können Sie die get Methode aufrufen, um den Wert zu erhalten.

var = tk.IntVar() 
... 
R1 = Radiobutton(..., variable=var, value=1, ...) 
... 
value = var.get() 

Da Sie Klassen verwenden, ist die beste Praxis var eine Instanzvariable zu machen. Dies bedeutet, dass Sie, anstatt eine globale Variable zu erstellen, diese in der Funktion erstellen, die den Radiobutton erstellt. Sie weisen es einer Instanzvariablen zu, auf die Sie dann überall in Ihrem Programm verweisen können, wenn Sie einen Verweis auf die Instanz der Klasse haben.

class Home(...): 
    def __init__(...): 
     self.var = tk.IntVar() 
     R1 = Radiobutton(..., variable=var, value=1, ...) 
     ... 

frame_1 = Home(...) 
... 
print("the value is:", frame_1.var.get()) 
+0

Was mache ich, um einen Controller zu machen? Ich bin meistens schon verloren xD –

+0

@GauravKararia: Ich bin mir nicht sicher. Das ist dein Code, nicht meins. Vielleicht kannst du dorthin zurückkehren, wo du den Code kopiert hast, um zu sehen, was er getan hat, um einen Controller zu erstellen. –