Jupyter notebook 上での入力は、
ipywidgets の SelectionRangeSlider 等を調べてみると良いかもしれません。
tkinter でダイアログを使うサンプル
Tk() を複数回呼び出す場合、特に destroy() してから再度使う際には注意が必要です。
tkinter.Tk() は、モジュール内グローバル変数 tkinter._default_root を設定し、
ダイアログ作成にrootを指定しなかった場合、暗黙的にデフォルトのrootが使われます。
間違いという訳ではありませんが、問題に繋がるケースが多いので
可能ならば Tk() はプロセス内で一度にします。
Jupyter notebook内で呼び出す場合は、初期化部分を別セルに別けるか、
後述のコードのような、tkinter._default_rootを再利用するコードを用います。
Tk()を複数回呼び出す様なケースでは、
大抵はウィンドウを閉じたい場合(Tk自体は終了しない)なので Toplevel で解決できます。
python
1#!/usr/bin/env python3.8
2
3import tkinter as tk
4from tkinter import simpledialog
5
6
7class MinMaxDialog(simpledialog.Dialog):
8
9 def __init__(self, parent, title, prompt=""):
10 self._prompt = prompt
11 super().__init__(parent, title)
12
13 def body(self, master):
14 self._ok = False
15 self._minVar = tk.IntVar(value=0)
16 self._maxVar = tk.IntVar(value=10)
17 if self._prompt:
18 tk.Message(master, text=self._prompt).pack()
19 tk.Label(master, text="Min:").pack()
20 tk.Entry(master, textvar=self._minVar).pack()
21 tk.Label(master, text="Max:").pack()
22 tk.Entry(master, textvar=self._maxVar).pack()
23
24 def apply(self):
25 self._ok = True
26
27 def getreult(self):
28 return self._ok, (self._minVar.get(), self._maxVar.get())
29
30
31def _get_default_root(master):
32 """
33 tkinter.Tk のインスタンス再生成を抑制する
34 """
35 if not master:
36 if tk._support_default_root and tk._default_root:
37 master = tk._default_root
38 else:
39 master = tk.Tk()
40 master.withdraw()
41 return master
42
43
44# TODO: default min/max vars
45def askminmax(title="", prompt="", parent=None):
46 dialog = MinMaxDialog(_get_default_root(parent), title, prompt)
47 return dialog.getreult()
48
49
50def main():
51 from tkinter.filedialog import askopenfilename
52
53 ok, result = askminmax("1回目")
54 if ok:
55 minVal, maxVal = result
56 print("Min:{}, Max:{}".format(minVal, maxVal))
57
58 print(askopenfilename())
59
60
61 # Jupyter notebook 上での実行なら、こちらは不要
62 ok, result = askminmax("2回目", "test")
63 if ok:
64 minVal, maxVal = result
65 print("Min:{}, Max:{}".format(minVal, maxVal))
66
67 print(askopenfilename())
68
69
70if __name__ == '__main__':
71 main()
72
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/14 05:06