2017-08-25 14 views
0

私はtkinterでクイズを作成しました。これはページごとに変わり、変数 "score"に追加されました。 最終スコアを表示したい場合は、実際のスコアの代わりに初期値を表示します。 誰かに同様の問題や解決策のアイデアがありますか?私たちは直接簡単にするために最後の質問ページを表示Label Tkinter変数

おかげ

import tkinter as tk     
from tkinter import font as tkfont 



class SampleApp(tk.Tk): 

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

     self.title_font = tkfont.Font(family='Helvetica', size=18, weight="bold", slant="italic") 

     # the container is where we'll stack a bunch of frames 
     # on top of each other, then the one we want visible 
     # will be raised above the others 
     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 (StartPage,theme1page,theme2page,theme1Q1,theme1Q2,theme1Q3,\ 
        theme1Q4,theme1Q5,theme2Q1,theme2Q2,theme2Q3,theme2Q4,theme2Q5, Results): 
      page_name = F.__name__ 
      frame = F(parent=container, controller=self) 
      self.frames[page_name] = frame 

      # put all of the pages in the same location; 
      # the one on the top of the stacking order 
      # will be the one that is visible. 
      frame.grid(row=0, column=0, sticky="nsew") 

     self.show_frame("StartPage") 

    def show_frame(self, page_name): 
     '''Show a frame for the given page name''' 
     frame = self.frames[page_name] 
     frame.tkraise() 

。変数scoreは、正しく答える間に増加するものです。

class theme1Q5(tk.Frame): 

    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     self.controller = controller 
     label = tk.Label(self, text="5.Question", font=controller.title_font) 
     label.pack(side="top", fill="x") 



     Question15 = tk.Label(self, text="Which sentence is not true?") 
     Question15.place(x=0, y = 30) 

     controll15 = tk.IntVar() 
     wrong151 = tk.Radiobutton(self, text="Neural Networks work bad with small amount of data", \ 
            variable= controll15,value=1) 
     wrong152 = tk.Radiobutton(self, text="Concept of neural network exists since the middle of the mid-twentieth",\ 
           variable= controll15,value=0) 
     right15 = tk.Radiobutton(self, text="There is no learning rate parameter in training neural networks", \ 
           variable= controll15,value=5) 
     wrong151.place(x=0, y=60) 
     wrong152.place(x=0, y=80) 
     right15.place(x=0, y=100) 

     def scorer(event): 
      if int(controll15.get()) > 2: 
       global score 
       score += 1 

     button = tk.Button(self, text="Result",command = lambda: controller.show_frame("Results")) 
     button.bind("<Button-1>", scorer) 
     button.pack(side="right") 

#END THEME 1   

実際の結果(スコア値)を表示するページです。問題は、すべての質問に正しく答えている間に、スコアの初期値(0)が表示されます。一方、「スコアを印刷する」ボタンに割り当てられているscorecalc関数は正しいスコアを示しています...実際の値を最初から表示することはできないようですが、ボタンをクリックしなければならない...

#RESULT PAGE 
class Results(tk.Frame): 

    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     self.controller = controller 
     label = tk.Label(self, text="Your Score:", font=controller.title_font) 
     label.pack(side="top", fill="x") 
     button = tk.Button(self, text="return to Menu", 
           command=lambda: controller.show_frame("StartPage")) 
     button.pack(side= "bottom") 


     global score 
     label = tk.Label(self, text= "%s/5" %(score), font=controller.title_font) 
     label.pack() 
     def scorecalc(): 
      label = tk.Label(self, text="Your Score:", font=controller.title_font) 
      label.pack(side="top", fill="x") 
      label = tk.Label(self, text= "%s/5" %(score), font=controller.title_font) 
      label.pack() 




     scorep= tk.Button(self, text ="print score", command=scorecalc) 
     scorep.pack() 





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

は同じのpythonファイルの3ページ部分はありますか? – user3535074

+0

はい、すべて1つのファイルの一部です。 – Jakun

+0

あなたはどこで「スコア」を決めていますか? – Lafexlos

答えて

1

コードに重大な問題があります。クラスを使用しながらグローバル変数を使用することは、私にとっては重大な生産性をもたらします。

コードが機能しない主な理由の1つは、クラス属性を使用する必要がある変数を使用しているためです。クラス内で変数を使用した場合、__init__の後にその変数と対話することはできません。それはウィジェットまたは数字や文字列のようなセーブ値です。

接頭辞self.をクラス内またはクラスオブジェクトの外部から対話するものに追加することで、これを修正できます。

あなたのコードでは、scoreというグローバル変数が実際には表示されないため、テスト用にグローバル名前空間に1つ追加しました。

ということを念頭において、複数のラベルに変数名ラベルを使用していました。変数名を割り当てるときはいつでも、それらを一意にする必要があります。

コードの3つのセクションを組み合わせて、スコアを更新する実際の例を提供しました。この例は完璧ではありませんが、探している結果を得るために変更する必要があるのは最小です。

何か質問がある場合は、私に教えてください:

import tkinter as tk     
from tkinter import font as tkfont 

score = 1 

class theme1Q5(tk.Frame): 

    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     self.controller = controller 
     label = tk.Label(self, text="5.Question", font=controller.title_font) 
     label.pack(side="top", fill="x") 

     Question15 = tk.Label(self, text="Which sentence is not true?") 
     Question15.place(x=0, y = 30) 

     self.controll15 = tk.IntVar() 
     wrong151 = tk.Radiobutton(self, text="Neural Networks work bad with small amount of data", 
            variable= self.controll15,value=1) 
     wrong152 = tk.Radiobutton(self, text="Concept of neural network exists since the middle of the mid-twentieth", 
           variable= self.controll15,value=0) 
     right15 = tk.Radiobutton(self, text="There is no learning rate parameter in training neural networks", 
           variable= self.controll15,value=5) 
     wrong151.place(x=0, y=60) 
     wrong152.place(x=0, y=80) 
     right15.place(x=0, y=100) 

     button = tk.Button(self, text="Result",command = lambda: controller.show_frame("Results")) 
     button.bind("<Button-1>", self.scorer) 
     button.pack(side="right") 

    def scorer(self, event = None): 
     if int(self.controll15.get()) > 2: 
      global score 
      score += 1 
      self.controller.frames["Results"].update_label() 

class SampleApp(tk.Tk): 

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

     self.title_font = tkfont.Font(family='Helvetica', size=18, weight="bold", slant="italic") 
     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 (theme1Q5, Results): 
      page_name = F.__name__ 
      frame = F(parent=container, controller=self) 
      self.frames[page_name] = frame 

      frame.grid(row=0, column=0, sticky="nsew") 

     self.show_frame("theme1Q5") 

    def show_frame(self, page_name): 
     '''Show a frame for the given page name''' 
     frame = self.frames[page_name] 
     frame.tkraise() 

#RESULT PAGE 
class Results(tk.Frame): 

    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     self.controller = controller 
     label = tk.Label(self, text="Your Score:", font=controller.title_font) 
     label.pack(side="top", fill="x") 
     button = tk.Button(self, text="return to Menu", 
           command=lambda: controller.show_frame("theme1Q5")) 
     button.pack(side= "bottom") 


     global score 
     self.label2 = tk.Label(self, text= "%s/5" %(score), font=self.controller.title_font) 
     self.label2.pack() 

    def update_label(self): 
     global score 
     self.label2.config(text= "%s/5" %(score)) 
     print(score) 

if __name__ == "__main__": 
    app = SampleApp() 
    app.mainloop() 
関連する問題