Skip to content

Commit 849ecd0

Browse files
committed
Merge branch 'feature-23' into main
2 parents 393c15a + f2f1a0d commit 849ecd0

5 files changed

Lines changed: 89 additions & 6 deletions

File tree

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Change Log
22

3+
## v1.5
4+
5+
- GUI追加(Tkinter)
6+
37
## v1.4
48

59
- 設定ファイルのデフォルトセクション名変更: `DEFAULT` -> `annotation`

README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,13 @@ python -m annotation -d
3131
python -m annotation -r
3232
```
3333

34+
または
35+
36+
```sh
37+
# ウインドウ(GUI)を開く
38+
python -m annotation -g
39+
```
40+
3441
### Optional arguments
3542

3643
```
@@ -39,6 +46,7 @@ optional arguments:
3946
--deploy, -d
4047
--register, -r
4148
--verbose, -v
49+
--gui, -g
4250
--file FILE, -f FILE Pickled pandas.Dataframe file path
4351
--workdir WORKDIR, -w WORKDIR
4452
Working directory path

annotation/__init__.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
from argparse import ArgumentParser
22

3+
from . import gui
34
from .lib import config as configlib
45
from .data import Data, CONFIG_DEFAULT
56

6-
__version__ = "1.4.2"
7+
__version__ = "1.5.0"
78

89

910
class Arguments(ArgumentParser):
@@ -18,6 +19,9 @@ def __init__(self) -> None:
1819
self.add_argument(
1920
"--verbose", "-v",
2021
action="count", default=0)
22+
self.add_argument(
23+
"--gui", "-g",
24+
action="count", default=0)
2125
self.add_argument(
2226
"--file", "-f",
2327
required=False, default=None,
@@ -55,6 +59,7 @@ def parse_args(self, args=None, namespace=None):
5559
# cast to bool
5660
pargs.deploy = bool(pargs.deploy)
5761
pargs.register = bool(pargs.register)
62+
pargs.gui = bool(pargs.gui)
5863
pargs.deploy_result = bool(pargs.deploy_result)
5964
pargs.create_config_file = bool(pargs.create_config_file)
6065
pargs.create_sample_datafile = bool(pargs.create_sample_datafile)
@@ -132,10 +137,11 @@ def main(args=None) -> None:
132137
# Load pickle datafile
133138
data.load()
134139

135-
if args.deploy:
140+
if args.gui:
141+
gui.main(data=data)
142+
elif args.deploy:
136143
data.deploy()
137-
138-
if args.register:
144+
elif args.register:
139145
data.register()
140146

141147
return None

annotation/data.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,18 @@ def __init__(self, config=dict(), default=CONFIG_DEFAULT) -> None:
6161
print(config)
6262
return None
6363

64+
def __len__(self) -> int:
65+
return len(self.df)
66+
67+
def count(self, type="all") -> int:
68+
type = type.lower()
69+
if type.lower() == "all":
70+
return len(self)
71+
elif type.lower() == "annotated":
72+
return (self.df[self.col_label]!=self.label_null).sum()
73+
else:
74+
raise ValueError(f"Type '{type}' is not defined")
75+
6476
def load(self) -> None:
6577
self.df = pd.read_pickle(self.datafile)
6678
if self.col_label not in self.df.columns:
@@ -90,8 +102,8 @@ def load(self) -> None:
90102
return None
91103

92104
def info(self) -> None:
93-
print("len(df):", len(self.df))
94-
print("annotated:", (self.df[self.col_label]!=self.label_null).sum())
105+
print("data:", self.count("all"))
106+
print("annotated:", self.count("annotated"))
95107
return None
96108

97109
def get_labelled(

annotation/gui.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import subprocess
2+
from tkinter import Tk, ttk, messagebox
3+
from .data import Data
4+
5+
6+
def main(data: Data) -> None:
7+
def _deploy(event=None):
8+
r = messagebox.askyesno("Deploy", "Deploy data to working directory?")
9+
if r:
10+
data.deploy()
11+
12+
def _register(event=None):
13+
r = messagebox.askyesno("Register", "Register annotation result to datafile?")
14+
if r:
15+
data.register()
16+
17+
def _open(event=None):
18+
subprocess.Popen(["explorer", data.workdir], shell=True)
19+
20+
root = Tk()
21+
frm = ttk.Frame(root, padding=20)
22+
frm.grid()
23+
24+
row = 0
25+
ttk.Label(frm, text="Annotation tool").grid(column=0, row=row, columnspan=2)
26+
27+
for k in ["datafile", "workdir"]:
28+
row += 1
29+
ttk.Label(frm, text=f"{k}: {data.__getattribute__(k)}").grid(column=0, row=row, columnspan=2)
30+
31+
row += 1
32+
ttk.Label(frm, text=f"data: {data.count('all')}").grid(column=0, row=row, columnspan=3)
33+
34+
row += 1
35+
ttk.Label(frm, text=f"annotated: {data.count('annotated')}").grid(column=0, row=row, columnspan=3)
36+
37+
row += 1
38+
ttk.Button(frm, text="[D]eploy", command=_deploy).grid(column=0, row=row)
39+
ttk.Button(frm, text="[R]egister", command=_register).grid(column=1, row=row)
40+
41+
row += 1
42+
ttk.Button(frm, text="[O]pen", command=_open).grid(column=0, row=row)
43+
44+
row += 1
45+
ttk.Button(frm, text="Config", command=None).grid(column=0, row=row)
46+
ttk.Button(frm, text="Quit", command=root.destroy).grid(column=1, row=row)
47+
48+
# keybind
49+
root.bind("d", _deploy)
50+
root.bind("r", _register)
51+
root.bind("o", _open)
52+
53+
root.mainloop()

0 commit comments

Comments
 (0)