2016-04-02 19 views
0

Basit bir denemeyi deniyorum, 3 çerçevem ​​var, 1. karede iki etiket var - "sayfa 2 için" ve "sayfa 3 için", aynı zamanda 2 etiketler.Radyo düğmesi yanıtına göre değişen kareler yanıtı

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() 

Ben kullanarak farz - kullanıcının bir sonraki sayfa düğmesini çarptığında seçildiği hangi radyo düğmesi dayalı, ben seçilmiş sayfa

bu kullanıcıyı getirmek için düğmeye istediğiniz koddur (benim PageOne sınıfında bulunan) bir kaç temel koşullar -

 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) 

bunu başarmak mümkün olacaktır, ancak işe görünmüyor. If ifadelerimdeki koşullar tamsayılar ama benim için 1 doğru ve 0; Yine de yanlış mı? Neyi yanlış yapıyorum?

cevap

0

Bence istediğin bu. Radyo işaretinin varsayılan olarak seçilmediğinden emin olmadım. Bunu senin için bir egzersiz olarak bıraktım. Bununla birlikte, sadece bu gibi sayfaları değiştirmek istiyorsanız, sadece düğmeleri kullanıyorum (tk/ttk.Button), o zaman radyo düğmesiyle uğraşmak zorunda kalmazsınız. Yine de, bu sadece benim tercihim ya iyi çalışacaktır elbette. Sayfayı değiştirmek için her düğmeyi bağlayabilirsiniz. Değiştirilen kodunuzdaki düğmeleri aşağıda açıkladım. Her sayfa için ileri/geri seçeneğine sahip olmak için düğme/radyo düğmesi oluşturmak istiyorsanız. Akımın hangisi olduğunu görmek için kontrol panelleri üzerinde yineleyebilir ve diğer karelere geçmek için aşağıdakilere benzer iki düğme oluşturabilirsiniz.

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

O bu beni oldukça değil iş verir vermez -() self.var1.get değilse: AttributeError: Sayfası1 örneği yok niteliği 'denetleyicisi' Eğer 'self.controller kurmadı gibi – Treeno1

+0

sesler vardır = denetleyici. Henüz yapmadıysanız kodun yukarısına kopyalamayı/yapıştırma yapmayı deneyin. – Pythonista

+0

ideal olarak, "Sonraki Sayfa" düğmesinin işlevselliğini koruyabilmesini isterim. Bu şekilde yaptım çünkü daha büyük bir projede kullanmayı düşünüyorum, bunun gibi bir şey: her biri karşılık gelen bir "Evet" ve "Hayır" radyo düğmesine sahip 10 soru içeren bir anket. Anketi tamamladıktan sonra, "Sonraki sayfa" düğmesine bastıklarında, belirli bir karenin görüntülenmesini istediğimde, söz konusu karenin metne eklenmesi, metnin okuyabileceği bir örnek olarak, "Seçimlerinize dayanarak, bu sizin tavsiyenizdir. ... " – Treeno1