最初の例では親クラスに投稿タイトルを作成します(新しいタイトルを検索するときは古いタイトルは削除しません)。私はそのクラスを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()
なぜウィジェットを親に入れるのですか?あなたがそれをしているなら、クラスを使用するポイントは何ですか?私は、自分自身の外にウィジェットを作成するフレームから継承するクラスの良いユースケースを見たことはないと思います。 'Frame'を継承しているクラスのメリットをすべて排除します。 –
これは継承の仕組みではありません。オブジェクトが信頼できるように継承するサブオブジェクトを作成することは期待できません。また、 'mainloop()'が終了した後にtkinterコードが動作することも期待できません。定義上、ウィジェットがすべて破壊されるまで終了しません。 –
@BryanOakley私の実際のコードでは、2番目のフレームは拡張可能なので、私のメインクラスでは必要としない関数がいくつかあります。 2番目のフレームには2つのエントリーと 'labels'のような関数を呼び出すボタンもあります。 – MushroomMauLa