2016-04-02 10 views
0

私は3つのフレームを持っています。フレーム1には2つのラベルがあります - "ページ2"と "ページ3"には2つのラジオボタンがありますラベル。ユーザーは、次ページボタンに当たったとき、選択されたラジオボタンに基づいて、私はボタンを選択したページラジオボタンの回答に基づいてフレームを変更する

にユーザーを持って帰りたいと思う、これはコードです -

import Tkinter as tk 

class MainApp(tk.Tk): 

    def __init__(self, *args, **kwargs): 

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

     # the main container that holds all the frames 
     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 = {} 

     # adding frames to the dictionary 
     for F in (Page1,Page2,Page3): 

      frame = F(container,self) 

      self.frames[F] = frame 

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

     self.show_frame(Page1) 

    def show_frame(self,page_name): 

     #SHOWS A FRAME WITH THE GIVEN NAME 
     for frame in self.frames.values(): 
      frame.grid_remove() 
     frame = self.frames[page_name] 
     frame.grid() 

    #STACKING THE FRAMES 
    #frame = self.frames[cont] 
    #frame.tkraise() 

class Page1(tk.Frame): 
    def __init__(self,parent,controller): 
     tk.Frame.__init__(self,parent) 

     lbl1 = tk.Label(self,text = "for page 2",font =("Helvetica",12,"bold")) 
     lbl1.grid(row=1,sticky="W") 

     lbl2 = tk.Label(self,text = "for page 3",font =("Helvetica",12,"bold")) 
     lbl2.grid(row=1,column=1,sticky="W") 

     btn1 = tk.Button(self, text="next page", font=('MS', 24, 'bold')) 
     btn1.grid(row=3,column = 0,columnspan=1) 
     #btn1['command'] = lambda: controller.show_frame(Page2) 


     self.var1 = tk.BooleanVar() 

     rButton1 = tk.Radiobutton(self,variable = self.var1,value=True) 
     rButton1.grid(row=2,sticky = "W") 

     rButton2 = tk.Radiobutton(self,variable = self.var1,value=False) 
     rButton2.grid(row=2,column=1,sticky = "W") 

     if self.var1.get() == 1: 
      btn1['command'] = lambda: controller.show_frame(Page3) 

     if self.var1.get() == 0: 
      btn1['command'] = lambda: controller.show_frame(Page2) 


class Page2(tk.Frame): 
    def __init__(self,parent,controller): 
     tk.Frame.__init__(self,parent) 

     lbl = tk.Label(self,text="This is page 2",font=("Helvetica",12,"bold")) 
     lbl.pack() 


class Page3(tk.Frame): 
    def __init__(self,parent,controller): 
     tk.Frame.__init__(self,parent) 

     lbl = tk.Label(self,text="This is page 3",font=("Helvetica",12,"bold")) 
     lbl.pack() 

app = MainApp() 
app.mainloop() 

私が使用していると仮定いくつかの基本的な条件(私のPageOneクラスに位置) -

 self.var1 = tk.BooleanVar() 

    rButton1 = tk.Radiobutton(self,variable = self.var1,value=True) 
    rButton1.grid(row=2,sticky = "W") 

    rButton2 = tk.Radiobutton(self,variable = self.var1,value=False) 
    rButton2.grid(row=2,column=1,sticky = "W") 

    if self.var1.get() == 1: 
     btn1['command'] = lambda: controller.show_frame(Page3) 

    if self.var1.get() == 0: 
     btn1['command'] = lambda: controller.show_frame(Page2) 

私はこれを達成することができるだろうが、動作するようには思えません。私のif文の条件は整数ですが、私の知識1はTrueと0を表します。とにかく偽ですか?私は間違って何をしていますか?

答えて

0

私はこれがあなたの望むものだと思います。私は、ラジオボタンがデフォルトで選択されていないことを確認することはできませんでした。私はそれをあなたの練習として残しました。ただ、このようなページを切り替えるには、ボタン(tk/ttk.Button)を使用するだけですが、ラジオボタンの操作については心配する必要はありません。しかし、それはちょうど私の好みのいずれかがもちろんうまく動作します。各ボタンをバインドしてページを切り替えることができます。私は以下の変更されたコードでボタンをコメントアウトしました。 ボタン/ラジオボタンを作成して各ページに進む/戻るオプションを設定したい場合は、コントローラーのフレームを繰り返して現在のフレームを確認し、下のフレームに類似した2つのボタンを作成して、他のフレームに移動することができます。

import tkinter as tk 

class MainApp(tk.Tk): 

    def __init__(self, *args, **kwargs): 

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

     # the main container that holds all the frames 
     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 = {} 

     # adding frames to the dictionary 
     for F in (Page1,Page2,Page3): 

      frame = F(container,self) 

      self.frames[F] = frame 

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

     self.show_frame(Page1) 

    def show_frame(self,page_name): 

     #SHOWS A FRAME WITH THE GIVEN NAME 
     for frame in self.frames.values(): 
      frame.grid_remove() 
     frame = self.frames[page_name] 
     frame.grid() 

    #STACKING THE FRAMES 
    #frame = self.frames[cont] 
    #frame.tkraise() 

class Page1(tk.Frame): 
    def __init__(self,parent,controller): 
     tk.Frame.__init__(self,parent) 
     self.controller = controller 

     lbl1 = tk.Label(self,text = "for page 2",font =("Helvetica",12,"bold")) 
     lbl1.grid(row=1,sticky="W") 

     lbl2 = tk.Label(self,text = "for page 3",font =("Helvetica",12,"bold")) 
     lbl2.grid(row=1,column=1,sticky="W") 

     btn1 = tk.Button(self, text="next page", font=('MS', 24, 'bold')) 
     btn1.grid(row=3,column = 0,columnspan=1) 
     #btn1['command'] = lambda: controller.show_frame(Page2) 


     self.var1 = tk.BooleanVar() 

     #rButton1 = tk.Button(self, text='Show Page 2', command=lambda: self.controller.show_frame(Page2)) 
     #rButton1.grid(row=2, sticky="W") 
     #rButton2 = tk.Button(self, text='Show Page 3', command=lambda: self.controller.show_frame(Page3)) 
     #rButton2.grid(row=2, column=1, sticky="W") 

     rButton1 = tk.Radiobutton(self,variable = self.var1,value=True, 
      command=self.switch_pages) 
     rButton1.grid(row=2,sticky = "W") 

     rButton2 = tk.Radiobutton(self,variable = self.var1,value=False, 
      command=self.switch_pages) 
     rButton2.grid(row=2,column=1,sticky = "W") 

    def switch_pages(self): 

     if not self.var1.get(): 
      self.controller.show_frame(Page3) 
     else: 
      self.controller.show_frame(Page2) 


class Page2(tk.Frame): 
    def __init__(self,parent,controller): 
     tk.Frame.__init__(self,parent) 

     lbl = tk.Label(self,text="This is page 2",font=("Helvetica",12,"bold")) 
     lbl.pack() 


class Page3(tk.Frame): 
    def __init__(self,parent,controller): 
     tk.Frame.__init__(self,parent) 

     lbl = tk.Label(self,text="This is page 3",font=("Helvetica",12,"bold")) 
     lbl.pack() 

app = MainApp() 
app.mainloop() 
+0

それは、かなりのない仕事をしてくれ、これを提供します - ()をself.var1.getない場合: はAttributeError:あなたは 'self.controllerを設定しなかったようPage1のインスタンスには属性「コントローラの – Treeno1

+0

が鳴りなかったです=コントローラ '。まだコードをコピーしていない場合は、上のコードを貼り付けてみてください。 – Pythonista

+0

理想的には、「次のページ」ボタンにその機能を保持させたいと思っています。私はこのようにしました。なぜなら、もっと大きなプロジェクトで使うつもりなので、10個の質問のアンケートとそれぞれ対応する「はい」と「いいえ」のラジオボタンがあります。アンケートを完了したら、「次のページ」ボタンを押すと特定のフレームが表示され、フレームにはテキストが挿入されます。たとえば、選択肢に基づいて、これがあなたのお勧めです... " – Treeno1

関連する問題