2

のオプションのドキュメントには、ダイアログ ボックスで使用することになっていると記載されていますが、私が知っている唯一のダイアログ ボックス関数はtk_dialog です。これはボタンを引数として取ることができず、ボタンのタイトルのみを受け取ることができます。Ttk::button-default

アプリを実行し、ユーザーがキーを押すと、このボタンが呼び出されるオプションが に設定されている実際Ttk::buttonの例はありますか? これが私の試みです:-defaultactiveenter

メインウィンドウに直接ボタンを配置しようとしました:

package require Tk

ttk::button .button -text "text" -default active -command "puts sometext"
bind .button <Return> { .button invoke }

pack .button

デフォルトでは、押しenterても何も起こりません。最初にtabボタンを選択する必要がありますenter

また、ボタンを に挿入しようとしましtk_dialogたが、次のように動作する可能性があると考えています。

package require Tk

tk_dialog .dg "Title" "Question" "" "" \
[ttk::button .button1 -text "Yes" -default disabled] \
[ttk::button .button2 -text "No" -default active]

しかし、それは 2 つのボタン ".button1" と ".button2" を作成するだけで、どちらもデフォルトで選択されたものではありません。(4 番目のパラメーターが空であるため、これは理にかなっています)。tk_dialogそれ自体はデフォルトのボタンを指定できますが、カスタム ボタンを渡すことはできません。ボタン名の文字列のみを受け入れるようです。

私がこれを尋ねている理由は、Tk にバインドする言語を書いていて、どの設定を公開する必要があるかを理解しなければならないからです。私はPythonを調べましたが、ボタンTkinterのオプションをラップしていないようです。-defaultこのオプションは で使用されたTkことがありますか? もしそうなら、適切な動作例を教えていただけますか? ありがとう。

4

3 に答える 3

1

この-defaultオプションは、実際には単なる表示インジケータです。それが何をするかは、使用しているテーマによって異なります。Windows XP 以降では、デフォルトのアクティブ ボタンは明るい青色になります。他のテーマでは、強調表示された境界線または別のエッジが依存している場合があります。古い古典的なテーマでは、それはいくつかの巨大な沈んだ境界線でした.

Enter または Escape を押したときに実際に何かが起こるようにするには、前述のように<Return>および<Escape>イベントを関連するボタンにバインドする必要があります。

使用しないでくださいtk_dialog。それは本当に古くて役に立たず、スタイルは現代のウィンドウシステムにまったく準拠していません。

ダイアログを適切に見せるために、あるアプリで使用するコードのスニペットを次に示します。

proc ::tkchat::Dialog {w args} {
    lappend args -class Dialog
    set dlg [eval [linsert $args 0 toplevel $w]]
    catch {wm attributes $w -type dialog}
    wm transient $dlg [winfo parent $dlg]
    wm group $dlg .
    return $dlg
}

これは、実行すべきいくつかの便利なことを示しています。まず、トップレベルのデフォルト クラスを用意して、ダイアログのデフォルト設定オプションを許可できるようにします。また-type、サポートされている場合に属性を設定します。これにより、最新の X ウィンドウ マネージャーが、他の種類の一時的なウィンドウではなく、ウィンドウをダイアログとしてスタイル設定できる拡張ウィンドウ マネージャー プロパティが設定されます。また、親ウィンドウの一時的なものとしてマークします。これにより、ウィンドウ マネージャーは、このトップレベルが実際に特定の親ウィンドウまたは所有者ウィンドウに関連付けられていることを認識します (タスクバーは、それを別のアプリケーションとして表示することを回避できます)。

これは、次のような場合に使用されます。

set dlg [Dialog .options]
wm withdraw $dlg
wm title $dlg "Options"

# ... create child windows and pack / grid them

set b_ok [ttk::button $dlg.ok -text OK -underline 0 -default active \
              -command [list [namespace origin EditOptionsClose] $dlg ok $pages]]
set b_cn [ttk::button $dlg.cancel -text Cancel -underline 0 \
              -command [list [namespace origin EditOptionsClose] $dlg cancel $pages]]

bind $dlg <Return> [list $b_ok invoke]
bind $dlg <Escape> [list $b_cn invoke]
bind $dlg <Alt-o>  [list focus $b_ok]
bind $dlg <Alt-c>  [list focus $b_cn]

wm protocol $dlg WM_DELETE_WINDOW [list $b_cn invoke]
wm resizable $dlg 0 0
catch {::tk::PlaceWindow $dlg widget .}
wm deiconify $dlg
tkwait visibility $dlg
focus $b_ok ; grab $dlg
tkwait variable [namespace which -variable _editoptions]
grab release $dlg
destroy $dlg

そこではかなり多くのことが起こっています。ダイアログを作成してから取り消します。これにより、多くの子をトップレベルに配置すると、パフォーマンスが向上します。これは、取り消されることで、全体をマップする必要があるまでジオメトリの計算を延期できるためです。次に、ボタンとその他すべてを作成し、それらをトップレベルに配置します。-default オプションを説明するためにボタンだけ-underlineを示し、アクセラレータ キーを表示するために を使用しました。

次にバインディング - Return と Escape は、常に WM_DELETE_WINDOW プロトコル メッセージ (ウィンドウ マネージャーまたは Windows の Alt-F4 によって提供される X ボタン) と共に処理する必要があります。これもサイズ変更不可にし、Tk ライブラリ ヘルパー関数を使用してアプリケーション ウィンドウ上に配置しますtk::PlaceWindow。最後に、ウィンドウをマップし、アクティブなウィジェットにキーボード フォーカスを設定します。

上記は、行儀の良いダイアログのほとんどすべてをカバーしていると思います。

于 2013-11-14T01:14:41.887 に答える
0

patthoyts が言ったように、これは単なる表示オプションです。私のマシンでは、このように見えます(タイル付き)

ここに画像の説明を入力

現在、「選択済み」ボタンにフォーカスがあります。

これを作成するために使用したスクリプトは単純です。

grid [ttk::button .b -default active -text Ok] [ttk::button .c -default disabled -text Cancel] -sticky nesw
grid [ttk::button .b -text Normal] [ttk::button .c -text Selected] -sticky nesw
grid rowconfigure . all -weight 1
grid columnconfigure . all -weight 1
于 2013-11-14T18:12:34.743 に答える
0

ドキュメント (-default の) は貧弱で古くなっています。

-default activeは単なる表示オプションであり、キーの機能には影響しませんでした。古いスタイルのボタンを使用する-default activeと、ボタンがデフォルトであったことを示すインジケーターとして、ハイライト背景領域でボタンを囲むくぼんだレリーフがオンになります。「アクティブ」はボタンの状態とは何の関係もなく、すべてハイライトと関係があるという点で少し混乱しています。

ハイライト背景領域は ttk:: ウィジェットではサポートされなくなりました。構成オプションは受け入れられますが、使用されません。

ダイアログで特定の操作を行うキーが必要な場合は、特定のボタンではなく、メイン ウィンドウにキーをバインドします。

bind . <Return> {.button2 invoke}
于 2013-11-14T00:02:33.173 に答える