-
Notifications
You must be signed in to change notification settings - Fork 31
/
Copy pathgui_misc.py
92 lines (82 loc) · 2.75 KB
/
gui_misc.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#-*- coding:utf-8 -*-
import Tkinter as tk
import re
import datetime
import math
vtype_func_map = {'int':int, 'float':float, 'str': str, 'bool':bool }
def keepdigit(x, p=5):
out = x
if isinstance(x, float):
if x >= 10**p:
out = int(x)
elif x>=1:
n = p + 1 - len(str(int(x)))
out = int(x*(10**n)+0.5)/float(10**n)
elif math.isnan(x):
out = 0
else:
out = int(x*10**p+0.5)/1.0/10**p
return out
def get_type_var(vtype):
if vtype == 'int':
v=tk.IntVar()
elif vtype == 'float':
v=tk.DoubleVar()
elif vtype == 'bool':
v=tk.BooleanVar()
else:
v=tk.StringVar()
return v
def type2str(val, vtype):
ret = val
if vtype == 'bool':
ret = '1' if val else '0'
elif 'list' in vtype:
ret = ','.join([str(r) for r in val])
elif vtype == 'date':
ret = val.strftime('%Y%m%d')
elif vtype == 'datetime':
ret = val.strftime('%Y%m%d')
else:
ret = str(val)
return ret
def str2type(val, vtype):
ret = val
if vtype == 'str':
return ret
elif vtype == 'bool':
ret = True if int(float(val))>0 else False
elif 'list' in vtype:
key = 'float'
if len(vtype) > 4:
key = vtype[:-4]
func = vtype_func_map[key]
ret = [func(s) for s in val.split(',')]
elif vtype == 'date':
ret = datetime.datetime.strptime(val,'%y%m%d').date()
elif vtype == 'datetime':
ret = datetime.datetime.strptime(val,'%y%m%d %H:%M:%S')
else:
func = vtype_func_map[vtype]
ret = func(float(val))
return ret
def field2variable(name):
return '_'.join(re.findall('[A-Z][^A-Z]*', name)).lower()
def variable2field(var):
return ''.join([s.capitalize() for s in var.split('_')])
class ScrolledFrame(tk.Frame):
def __init__(self, root):
tk.Frame.__init__(self, root)
self.canvas = tk.Canvas(root, borderwidth=0)
self.frame = tk.Frame(self.canvas)
self.vsby = tk.Scrollbar(root, orient="vertical", command=self.canvas.yview)
self.vsbx = tk.Scrollbar(root, orient="horizontal", command=self.canvas.xview)
self.canvas.configure(yscrollcommand=self.vsby.set, xscrollcommand=self.vsbx.set)
self.vsbx.pack(side="bottom", fill="x")
self.vsby.pack(side="right", fill="y")
self.canvas.pack(side="left", fill="both", expand=True)
self.canvas.create_window((4,4), window=self.frame, anchor="nw")
self.frame.bind("<Configure>", self.onFrameConfigure)
def onFrameConfigure(self, event):
'''Reset the scroll region to encompass the inner frame'''
self.canvas.configure(scrollregion=self.canvas.bbox("all"))