2017-11-17 34 views
0

最初の例では親クラスに投稿タイトルを作成します(新しいタイトルを検索するときは古いタイトルは削除しません)。私はそのクラスを2に分割したいと思っていました。 チェックボタンが1つあり、最初のフレームを2番目のフレームに展開し、post.titles labelsを作成する必要があります。 2番目のフレーム(1.frameを展開)では、 は、入力フィールド、2つのエントリ、および検索ボタンを表す2つのラベルです。このボタンはStackoverflowApiのadvanced_search関数を呼び出し、postオブジェクトのリストを返します。これは私のファーストクラスのcreatePosts関数で必要なリストです。サブクラスからParentクラス内にTkinterウィジェットを作成する方法

私の2番目の例では、ポストは最初のフレームではなく2番目のフレームで作成されます。 Hereは、それがどのように見えるべきかの例であり、それは今見てんか

import tkinter as tk 
import tkinter.ttk as ttk 
import StackoverflowApi as API 

class SearchFrame: 
    def __init__(self, parent, title, main_frame): 
     self.main_frame=main_frame 
     self.title=title 
     self.parent=parent 
     self.expanded = tk.IntVar() 
     self.expanded.set(0) 
     self.pagesize=tk.IntVar() 
     self.pagesize.set(10) 
     self.tags=tk.StringVar() 

     self.title_frame=ttk.Frame(self.parent) 
     self.title_frame.pack(fill="x", expand=1) 

     self.expand_button=ttk.Checkbutton(self.title_frame, 
              text=self.title +' +', 
              command=self.expand, 
              variable=self.expanded, 
              style='Toolbutton', 
              ) 
     self.expand_button.pack(fill='x', expand=1) 
     #self.expand_button.configure(bg='grey') gonna fix this later 

     self.sub_frame=ttk.Frame(self.parent, relief='sunken', borderwidth=1) 

     self.tag_label=ttk.Label(self.sub_frame, 
           text='Tags').pack(side='left', 
                expand=1, 
                pady=5) 
     self.tag_entry=ttk.Entry(self.sub_frame, 
           textvariable=self.tags).pack(side='left', 
                   expand=1, 
                   pady=5) 
     self.pagesize_label=ttk.Label(self.sub_frame, 
             text='Pagesize').pack(side='left', 
                  expand=1, 
                  pady=5) 
     self.pagesize_entry=ttk.Entry(self.sub_frame, 
             textvariable=self.pagesize).pack(side='left', 
                     expand=1, 
                     pady=5) 
     self.search_button=ttk.Button(self.sub_frame, text='Search', 
             command=self.search).pack(side='left', 
                   expand=1, 
                   pady=5) 

    def search(self): 
     api = API.StackoverflowApi() 
     self.posts = api.advanced_search(tagged=list(self.tags.get()), 
            pagesize=self.pagesize.get()) 

     for post in self.posts: 
      self.post=ttk.Label(self.parent, text=post.title).pack() 

    def expand(self): 
     if bool(self.expanded.get()): 
      self.sub_frame.pack(fill="x", expand=1) 
      self.expand_button.configure(text=self.title +' -') 
     else: 
      self.sub_frame.forget() 
      self.expand_button.configure(text=self.title +' +') 

root = tk.Tk() 
search = SearchFrame(root,'Search Options') 
search.search() 
root.mainloop() 

これでいた私は、それは厄介

from tkinter import * 
from tkinter import ttk 
import StackoverflowApi as API 

root=Tk() 
class FrameOne(ttk.Frame): 
    ''' Main Frame in which posts should be created ''' 
    def __init__(self, parent, *args, **kwargs): 
     ttk.Frame.__init__(self, parent, *args, **kwargs) 
     self.pack() 

     #Vars 
     self.expanded=IntVar() 
     self.expanded.set(0) 

     self.expand_button=ttk.Checkbutton(self, 
              text='Seach Options +', 
              command=self.expand, 
              variable=self.expanded, 
              style='Toolbutton', 
              ) 
     self.expand_button.pack(fill='x', expand=1) 

     self.sub_frame=ExtendingFrame(parent, relief='sunken', borderwidth=1) 


    def expand(self):#function for expanding the second frame 
     if bool(self.expanded.get()): 
      self.sub_frame.pack(fill="x", expand=1) 
      self.expand_button.configure(text='Seach Options -') 
     else: 
      self.sub_frame.forget() 
      self.expand_button.configure(text='Seach Options +') 

    def createPosts(self, posts): 

     for post in posts: 
      self.post=ttk.Label(self, text=post.title) 
      self.post.pack() 


class ExtendingFrame(FrameOne): 
    ''' this is the frame, which apperas when the checkbutton in the first frame 
    is clicked. 
    The Frame has 2 entries "tags" and "pagesize" I need these for my api call 
    ''' 
    def __init__(self, parent, *args, **kwargs): 
     self.parent=parent 
     ttk.Frame.__init__(self, parent, *args, **kwargs) 

     #Vars 
     self.tags=StringVar() 
     self.pagesize=IntVar() 
     self.pagesize.set(15) 

     self.tag_label=ttk.Label(self, text='Tags', anchor='e') 
     self.tag_label.pack(fill='x', expand=1, side='left', pady=5, padx=2) 
     self.tag_entry=ttk.Entry(self, textvariable=self.tags) 
     self.tag_entry.pack(fill='x', expand=1, side='left', pady=5) 
     self.pagesize_label=ttk.Label(self, text='Pagesize', anchor='e') 
     self.pagesize_label.pack(fill='x', expand=1,side='left', pady=5, padx=2) 
     self.pagesize_entry=ttk.Entry(self, textvariable=self.pagesize) 
     self.pagesize_entry.pack(fill='x', expand=1, side='left', pady=5) 
     self.search_button=ttk.Button(self, text='Search',command=self.search) 
     self.search_button.pack(fill='x', expand=1, side='left', pady=5, padx=2) 

    def search(self): 
     ''' calls the search function of the api, with the ''' 
     api = API.StackoverflowApi() 
     self.posts = api.advanced_search(
       tagged=list(self.tags.get()), 
       pagesize=self.pagesize.get() 
       ) 
     #self.posts is a list of question objects returned by the api 
     return super().createPosts(self.posts)#I need the objects from the list in my createPosts function 

main=FrameOne(root) 
root.mainloop() 
+1

なぜウィジェットを親に入れるのですか?あなたがそれをしているなら、クラスを使用するポイントは何ですか?私は、自分自身の外にウィジェットを作成するフレームから継承するクラスの良いユースケースを見たことはないと思います。 'Frame'を継承しているクラスのメリットをすべて排除します。 –

+1

これは継承の仕組みではありません。オブジェクトが信頼できるように継承するサブオブジェクトを作成することは期待できません。また、 'mainloop()'が終了した後にtkinterコードが動作することも期待できません。定義上、ウィジェットがすべて破壊されるまで終了しません。 –

+0

@BryanOakley私の実際のコードでは、2番目のフレームは拡張可能なので、私のメインクラスでは必要としない関数がいくつかあります。 2番目のフレームには2つのエントリーと 'labels'のような関数を呼び出すボタンもあります。 – MushroomMauLa

答えて

0

に見えると思うので、二つのクラスに分割さ上記のコードを実行する私の試み下のコードは、MainAppという2つのクラスを持ち、SearchFrameクラスのメソッドを使用してMainAppの親ウィジェットにラベルを作成するクラスを持っています。この場合、SearchFrameの親ウィジェットはMainAppです。実際にラベルが親ウィジェットのサブクラスMainAppの内部に作成されていることを確認したい場合は、ジオメトリマネージャをself.frame2にコメントアウトすることができます。繰り返しますが、これは良い練習であるとは思わないでしょう:

import tkinter as tk 

root = tk.Tk() 

class MainApp(tk.Frame): 
    def __init__(self, master): 
     super().__init__(master) 

     #a child frame of MainApp object 
     self.frame1 = tk.Frame(self) 

     tk.Label(self.frame1, text="This is MainApp frame1").pack() 

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


     #another child frame of MainApp object 
     self.frame2 = SearchFrame(self) 

     self.frame2.grid(row=0, column=1, sticky="nsew") 




    def create_labels(self, master): 
     return tk.Label(master, text="asd") 


class SearchFrame(tk.Frame): 
    def __init__(self, master): 
     super().__init__(master) 

     self.label = tk.Label(self, text="this is SearchFrame") 
     self.label.pack() 

     master.label1 = MainApp.create_labels(self, master) 

     master.label1.grid() 


mainAppObject = MainApp(root) 
mainAppObject.pack() 

root.mainloop() 
関連する問題