2016-10-06 44 views
-1

私のコースの1つは、tkinterへの参照を渡しました。また、入門コースの範囲外でした。それは私の好奇心を刺激し、私はそれを深く掘り下げたいと思った。Python - tkinter - 動的チェックボックス

私は基本的なことを思いついています。私は、私が好きな場所に表示されるようにチェックボックスを表示することができますが、私はそれをよりダイナミックに/ピジョンソニックにしたいと思います。

カラム1 - すべてのチェックボックスが常に表示されます。これは期待どおりに動作します。 列2 - 最初のチェックボックスのみが表示され、クリックされた場合は、さらに4つのチェックボックスが表示されます。これら4つのチェックボックスのいずれかをクリックすると、UIの下部にあるテキストボックスにメッセージが表示されます。

現時点で2列目のフォーカスコースのチェックボックスをクリックすると、何もしません。また、コアコースのチェックボックスをオンにすると、通常隠されているABC 702のチェックボックスがランダムに表示されるようです。なぜ私は理解できません。

from tkinter import * 

    class Application(Frame): 
     def __init__(self, master): 
      Frame.__init__(self, master) 
      self.grid() 
      self.create_widgets() 
      # self.grid() 
      # self.create_widgets() 

     def create_widgets(self): 
      Label(self, text="How many of the core courses have you completed so far?" 
       ).grid(row=1, column=0, sticky=W) 

      self.checkBoxA = BooleanVar() 
      Checkbutton(self, 
         text="ABC 501", 
         variable=self.checkBoxA, 
         command=self.update_text 
         ).grid(row=2, column=0, sticky=W) 

      self.checkBoxB = BooleanVar() 
      Checkbutton(self, 
         text="ABC 502", 
         variable=self.checkBoxB, 
         command=self.update_text 
         ).grid(row=3, column=0, sticky=W) 

      self.checkBoxC = BooleanVar() 
      Checkbutton(self, 
         text="ABC 601", 
         variable=self.checkBoxC, 
         command=self.update_text 
         ).grid(row=4, column=0, sticky=W) 
      self.checkBoxD = BooleanVar() 
      Checkbutton(self, 
         text="ABC 602", 
         variable=self.checkBoxD, 
         command=self.update_text 
         ).grid(row=5, column=0, sticky=W) 
      self.checkBoxE = BooleanVar() 
      Checkbutton(self, 
         text="ABC 603", 
         variable=self.checkBoxE, 
         command=self.update_text 
         ).grid(row=6, column=0, sticky=W) 
      self.checkBoxF = BooleanVar() 
      Checkbutton(self, 
         text="ABC 701", 
         variable=self.checkBoxF, 
         command=self.update_text 
         ).grid(row=7, column=0, sticky=W) 

      self.results_txt = Text(self, width=80, height=10, wrap=WORD) 
      self.results_txt.grid(row=8, column=0, columnspan=3) 

      Label(self, text="Which focus are you enrolled in?" 
       ).grid(row=1, column=1, sticky=W) 

      self.checkBoxF1 = BooleanVar() 
      Checkbutton(self, 
         text="Focus #1", 
         variable=self.checkBoxF1, 
         command=self.update_text 
         ).grid(row=2, column=1, sticky=W) 

      # if self.checkBoxF1.get(): 
      #  self.checkBoxF1A = BooleanVar() 
      #  Checkbutton(self, 
      #     text="ABC 503", 
      #     variable=self.checkBoxF1A, 
      #     command=self.update_text 
      #    ).grid(row=3, column=1, sticky=W) 


     def update_text(self): 
      courses = "" 
      counter = 0 
      focusCounter = 0 

     ##The checkboxes for the focus courses do not display text at the bottom 
      ##The ABC 702 checkbox randomly appears when clicking core courses 
      ##Is this related to reusing self vs creating another attribute? 
      if self.checkBoxF1.get(): 
       self.checkBoxF1A = BooleanVar() 
       Checkbutton(self, 
          text="ABC 503", 
          variable=self.checkBoxF1A, 
          command=self.update_text 
          ).grid(row=3, column=1, sticky=W) 

       self.checkBoxF1B = BooleanVar() 
       Checkbutton(self, 
          text="ABC 504", 
          variable=self.checkBoxF1B, 
          command=self.update_text 
          ).grid(row=4, column=1, sticky=W) 

       self.checkBoxF1C = BooleanVar() 
       Checkbutton(self, 
          text="ABC 505", 
          variable=self.checkBoxF1C, 
          command=self.update_text 
          ).grid(row=5, column=1, sticky=W) 

      self.checkBoxF1D = BooleanVar() 
      Checkbutton(self, 
         text="ABC 702", 
         variable=self.checkBoxF1D, 
         command=self.update_text 
         ).grid(row=6, column=1, sticky=W) 

      if self.checkBoxA.get(): 
       courses += "Introductory class \n" 
       counter += 1 

      if self.checkBoxB.get(): 
       courses += "Next level class description \n" 
       counter += 1 

      if self.checkBoxC.get(): 
       courses += "Core class #3 \n" 
       counter += 1 

      if self.checkBoxD.get(): 
       courses += "Another core class \n" 
       counter += 1 

      if self.checkBoxE.get(): 
       courses += "A higher level class \n" 
       counter += 1 

      if self.checkBoxF.get(): 
       courses += "An advanced class \n" 
       counter += 1 

      if self.checkBoxF1A.get(): 
       specialty = "Focused class #1" 
       focusCounter += 1 

      if self.checkBoxF1B.get(): 
       specialty = "Focused class #2" 
       focusCounter += 1 

      if self.checkBoxF1C.get(): 
       specialty = "Focused class #3" 
       focusCounter += 1 

      if self.checkBoxF1D.get(): 
       specialty = "Focused class #4" 
       focusCounter += 1 

      self.results_txt.delete(0.0, END) 
      self.results_txt.insert(0.0, courses) 
      if focusCounter > 0: #this means the user selected at least 1 focus course 
       self.results_txt.insert(0.0, specialty) 
      if counter == 6: 
       congrats = ("\n Congratulations on completing all of your core courses! \n \n") 
       self.results_txt.insert(0.0, congrats) 
      # print(focusCounter) 

    root = Tk() 
    root.title("This is where the title goes") 
    app = Application(root) 
    root.mainloop() 

答えて

0

あなたが最初のクリックのチェックボックスFocus #1は、それが新しいチェックボックスが表示されている場合、彼らは

期待通りに動作しますが、あなたが最初のように、他のチェックボックスをクリックした場合、あなたは問題があるためである

AttributeError: 'Application' object has no attribute 'checkBoxF1A'

エラーメッセージが表示されますupdate_text()では、まだ存在しない場合でもcheckBoxF1AcheckBoxF1Bなどを使用します。

if self.checkBoxF1A.get(): 
    specialty = "Focused class #1" 
    focusCounter += 1 

create_widgets()self.checkBoxF1A = BooleanVar()を作成する - ないif self.checkBoxF1.get()に、あなたは問題はありません。

あなたも、それを隠すためにself.checkbutton_F1.grid_forget()else:に)ウィジェットとを表示するためにself.checkbutton_F1.grid(...)を使用create_widgets()

self.checkbutton_F1 = Checkbuttons(...) 

if self.checkBoxF1A.get():中にgrid()なしCheckbuttonsを作成することができます。

関連する問題