いくつかのTkウィジェットは、Ttkバージョンにも存在します。通常は同じ動作をしますが、インスタンスごとの外観属性(「bg
」など)ではなく「スタイル」と「テーマ」を使用します。 Ttkウィジェットは、デフォルトでOSのウィンドウマネージャーの「標準的な外観」を採用しているため、外観について何も設定する必要はありません。 showvalue
とtickinterval
(referenceを参照してください):ttk.Scaleをtk.Scaleのように動作させるには?
しかし、何らかの理由でttk.Scale
ウィジェットはtk.Scale
ウィジェットの2つの非常に便利なオプションを持っていません。これは、見た目よりも行動に関するものほど奇妙です。
ttk
の外観を維持しながら、これらの2つのオプションを「イテレート」することは素晴らしいことです。 次のコードは、これで私の不器用な試みです。問題は、よりよい方法があるということです。 (明らかにクラス全体をカプセル化することに加えて)、半自動化されたtickinterval
(以下のコードのように手作業で行うのではなく)をどのようにして合理的に得るのでしょうか?
import tkinter as tk
import tkinter.ttk as ttk
# initial setup
root = tk.Tk()
frame = tk.Frame(root)
#################################################################
# create a tk slider showing current value and ticks
# (showvalue=True is the default)
tkslider = tk.Scale(frame, from_=-4, to=4,
orient=tk.HORIZONTAL, tickinterval=2)
#################################################################
#################################################################
# create a ttk slider showing current value and ticks
# use a ttk frame to get ttk style background
ttkslider = ttk.Frame(frame)
# define a callback function to update the value label
def ttk_slider_callback(value):
# 'value' seems to be a string - bug or feature?
value_label.config(text=round(float(value)))
# 'text' can apparently be an int and gets converted into str
# (...) possibly do other stuff
# decompose frame into two ttk labels and a ttk scale
value_label = ttk.Label(ttkslider, text=0)
actual_slider = ttk.Scale(ttkslider, from_=-4, to=4,
command=ttk_slider_callback)
# (orient=tk.HORIZONTAL is the default)
ticks_label = ttk.Label(ttkslider, text=' -4 -2 0 2 4 ')
# put it all together
value_label.grid()
actual_slider.grid()
ticks_label.grid()
#################################################################
# final setup
tkslider.grid(row=0, column=0)
ttkslider.grid(row=0, column=1)
frame.grid()
root.mainloop()
前のコードの結果は、actualyスケールを「スライド」する前に、右に左、TTK規模でTkのスケールで、このようになります(OS /ウィンドウマネージャごとに明らかに変化するであろう):
いくつかのアイデア:1) 'showvalue'の実装では' Scale'ウィジェットと 'Label'ウィジェットの両方に' StringVar'を単独で使うことができます。残念ながら、 'ttk.Scale'には' digits'オプションがありません。これは、値の文字列表現を制御します。とにかく、私の意見では、それは今のところOKです。 2) 'tickinterval'の実装はもっと難しいです:全ての" tick "値(必要な' tickinterval'を知っているので)、ラベルと[coords](https://www.tcl.tk/man/tcl/ TkCmd/ttk_scale.htm#M23)( 'tk'は' root.tk.call(actual_slider、 'coords'、str(round(float(value)))) ')')を呼び出し、これらのラベルを 'Scale' 。 – CommonSense
@CommonSense 1)私は実際に投稿前にウィジェット間通信に 'StringVar'を使用しようとしましたが、悲しいことに、実際にはラベル位置も崩してしまうフロートの表示が残念です。数字の「手作業による」丸め処理により、きれいな表示が得られます。 2)リンクのおかげで、それは有用であるかもしれません – Dalker