16

tkinter / ttkのトグルボタン(チェックボタン)に基づいてフレームの拡大/縮小を処理するウィジェット/クラスがすでにあるかどうか誰かが知っていますか?

この質問は、特定のアクションによって分類された多くのオプションがある雑然としたGUIをクリーンアップしようとした私の試みから生じています。私は次のようなものが欲しいです:

ここに画像の説明を入力してください
グーグルで見つかった例

ただし、テキストだけでなく、ボタン、エントリ、tkinterのウィジェットのいずれかを許可します。これがまだ存在しない場合、tkinterフレームを継承するクラスを作成することは可能/有用でしょうか?

import tkinter as tk
import ttk

class toggledFrame(tk.Frame):
    def __init__(self):
        self.show=tk.IntVar()
        self.show.set(0)
        self.toggleButton=tk.Checkbutton(self, command=self.toggle, variable=self.show)
        self.toggleButton.pack()
        self.subFrame=tk.Frame(self)

    def toggle(self):
        if bool(self.show.get()):
            self.subFrame.pack()
        else:
            self.subFrame.forget()

注:このコードはテストされておらず、概念を示しているだけです

4

2 に答える 2

22

機能するコードを取得するのにどれだけ近づいたかに、実際に驚いています。私はそれにもう少し取り組むことに決め、私が望んでいたことを正確に実行するための簡単な小さなクラスを開発しました (コードに関するコメントや提案は大歓迎です):

import tkinter as tk
from tkinter import ttk 


class ToggledFrame(tk.Frame):

    def __init__(self, parent, text="", *args, **options):
        tk.Frame.__init__(self, parent, *args, **options)

        self.show = tk.IntVar()
        self.show.set(0)

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

        ttk.Label(self.title_frame, text=text).pack(side="left", fill="x", expand=1)

        self.toggle_button = ttk.Checkbutton(self.title_frame, width=2, text='+', command=self.toggle,
                                            variable=self.show, style='Toolbutton')
        self.toggle_button.pack(side="left")

        self.sub_frame = tk.Frame(self, relief="sunken", borderwidth=1)

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


if __name__ == "__main__":
    root = tk.Tk()

    t = ToggledFrame(root, text='Rotate', relief="raised", borderwidth=1)
    t.pack(fill="x", expand=1, pady=2, padx=2, anchor="n")

    ttk.Label(t.sub_frame, text='Rotation [deg]:').pack(side="left", fill="x", expand=1)
    ttk.Entry(t.sub_frame).pack(side="left")

    t2 = ToggledFrame(root, text='Resize', relief="raised", borderwidth=1)
    t2.pack(fill="x", expand=1, pady=2, padx=2, anchor="n")

    for i in range(10):
        ttk.Label(t2.sub_frame, text='Test' + str(i)).pack()

    t3 = ToggledFrame(root, text='Fooo', relief="raised", borderwidth=1)
    t3.pack(fill="x", expand=1, pady=2, padx=2, anchor="n")

    for i in range(10):
        ttk.Label(t3.sub_frame, text='Bar' + str(i)).pack()

    root.mainloop()

このコードは以下を生成します。
ここに画像の説明を入力

于 2012-11-01T01:13:42.367 に答える
0

私の知る限り、Tkinter/ttk はそのようなウィジェットを提供していません。. を使用して、例 (ラベルリストの展開/折りたたみ) を模倣することができますtkinter.ttk.Treeview

独自のウィジェットを開発することは完全に受け入れられます1 。コードは正しいスタートのようです。

于 2012-10-30T16:02:23.920 に答える