-
Notifications
You must be signed in to change notification settings - Fork 25
/
MeterLogin.py
112 lines (83 loc) · 3.53 KB
/
MeterLogin.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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#!/usr/bin/env python3
# Copyright © 2012-13 Qtrac Ltd. All rights reserved.
# This program or module is free software: you can redistribute it
# and/or modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version. It is provided for
# educational purposes and is distributed in the hope that it will be
# useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
import getpass
import tkinter as tk
import tkinter.ttk as ttk
if __name__ == "__main__": # For stand-alone testing with parallel TkUtil
import os
import sys
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__),
"..")))
import TkUtil
import TkUtil.Dialog
PAD = "0.75m"
class Result:
def __init__(self):
self.username = None
self.password = None
self.ok = False
def __str__(self):
return "username={} password={} ok={}".format(self.username,
self.password, self.ok)
class Window(TkUtil.Dialog.Dialog):
def __init__(self, master, result):
self.result = result
super().__init__(master, "Meter — Login",
TkUtil.Dialog.OK_BUTTON|TkUtil.Dialog.CANCEL_BUTTON)
def initialize(self):
self.update_ui()
def body(self, master):
self.create_widgets(master)
self.create_layout()
self.create_bindings()
return self.frame, self.usernameEntry
def create_widgets(self, master):
self.frame = ttk.Frame(master)
self.usernameLabel = ttk.Label(self.frame, text="Username:",
underline=-1 if TkUtil.mac() else 0)
self.usernameEntry = ttk.Entry(self.frame, width=25)
self.usernameEntry.insert(0, getpass.getuser())
self.passwordLabel = ttk.Label(self.frame, text="Password:",
underline=-1 if TkUtil.mac() else 0)
self.passwordEntry = ttk.Entry(self.frame, width=25, show="•")
def create_layout(self):
self.usernameLabel.grid(row=0, column=0, padx=PAD, pady=PAD)
self.usernameEntry.grid(row=0, column=1, padx=PAD, pady=PAD)
self.passwordLabel.grid(row=1, column=0, padx=PAD, pady=PAD)
self.passwordEntry.grid(row=1, column=1, padx=PAD, pady=PAD)
def validate(self):
return self.usernameEntry.get() and self.passwordEntry.get()
def create_bindings(self):
if not TkUtil.mac():
self.bind("<Alt-p>", lambda *args: self.passwordEntry.focus())
self.bind("<Alt-u>", lambda *args: self.usernameEntry.focus())
self.usernameEntry.bind("<KeyRelease>", self.update_ui)
self.passwordEntry.bind("<KeyRelease>", self.update_ui)
def update_ui(self, event=None):
state = "!" + tk.DISABLED if self.validate() else tk.DISABLED
self.acceptButton.state((state,))
def apply(self):
self.result.username = self.usernameEntry.get()
self.result.password = self.passwordEntry.get()
self.result.ok = True
if __name__ == "__main__":
if sys.stdout.isatty():
def close(event):
window.destroy()
application.quit()
application = tk.Tk()
result = Result()
window = Window(application, result)
print(result.username, result.password)
application.bind("<Escape>", close)
application.mainloop()
else:
print("Loaded OK")