⇤ ← Revision 1 as of 2019-05-25 02:16:20
Size: 10793
Comment:
|
Size: 10850
Comment:
|
Deletions are marked like this. | Additions are marked like this. |
Line 1: | Line 1: |
## page was renamed from TextCtrlAutoComplete (Phoenix) |
Customized password dialog (Phoenix)
Keywords : dialog, password.
Contents
Demonstrating :
Tested py3.x, wx4.x and Win10. Are you ready to use some samples ? Test, modify, correct, improve and share your discoveries !
First example
ICON file : icon_wxWidgets.ico
Toggle line numbers
1 # sample_one.py
2 import os
3 import wx
4 from wx.lib.embeddedimage import PyEmbeddedImage
5 # class MyFrame
6 # class MyDlgLogin
7 # class MyApp
8 Key_Png = PyEmbeddedImage(
9 b'iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAAAsTAAALEwEAmpwY'
10 b'AAAKU0lEQVRoBe2aaXBV533Gf2e5517p6mqXkARahBYDYsEglhG4SbBZHPBiJ23G6ZdMnHxI'
11 b'xp52OvnSTnA77dClkzbJmLgd4oZAxw4uocbU4NQRBBtjBAgkawEhoUW6aNGVdBfp7vec85YZ'
12 b'vR80GtJJMxfUzOSZ+c97vun3PHre9yySIoTgd1kqS63fG/gdl84CKYrCo9KxlXnFaoxvZ+Xb'
13 b'fxgNMXQ0EPuz5khyBIjxG0oIgc4j1turCvV4VHzJ5RCHap9O1Kx+KcbwOWON/1+dRf1J65XB'
14 b'lNUFRPm/uJDDw9abNUU7j9UWXWx+Pkf4TjqEGEaIgfvTj+j6E5f4YW7WzVqHtg3I/E3Z5TH6'
15 b'cCt0ZE3xKpHg78obUs9s+EpEK21MojiAWUBIXAfcPWpw8XXH3eOxxLcuJcwWIAKIJavQ4Q0l'
16 b'BVpc+YusPPMbG56LZNc/HUPPFhBifjTAiaSB2peTaDq1/MA4fM+0vzlo2TeBCL9eD+83cHhj'
17 b'6S6XxpsNT0aq1z4bIavSghAwBwAYEt4hry0AwA0DP3Jw/vv67e/FE9/stew2IPpIK3R4U2ml'
18 b'Q1Gad7/qr61+Mg5hmXgS0CW4hBeoDN9Q8d3QcWTalDWmuF84ho46+Phf9DvHo8lXL6SsK8g6'
19 b'PZIKWUnth9u/Gqqt3hWHSSAo6+KS4IZM3mkwfKWcjw/6kh3T1mSppjs3NOjF61+JUf2NFEaG'
20 b'eMz4nuNIwBYvt1n2dSAMiId6I/v+xhWvVG+OP7fxhTCEAD+gL4SXowFUMPLLUn4+Fr/9T6Ho'
21 b'+9/xh/+5s0Pp8l0yIAzLD5h87tVU1auG4/A6Td38oNNJTSv8lhU1OYX2azu/HkIzBASQSS+C'
22 b'd0oDSiF2TBVjtj0B3ADOxSxxJjWtQoYCloeyPRZPfc1c/R1Df2Orpm4B3ICSdgOvN5U7VEV5'
23 b'4wsv+4vyqlLgAywgY+FmXWxijOoDjcqXM7Q1uaoSqdRVX52qPZ7bYIHDCWv3Q0ED5Qcs9n3b'
24 b'XP3nLu3fD2jqLiBLmkjfHojGlT/dtCu8p2p7HPxAQtbGWDiL9oB/hIqmLl44+PXy6iNnDztT'
25 b'iVjt58MrVuxJQqoeMiphzWqInKJ4Zwc7LFbM/lg99H7EfhnoBqJpMfCP2yuallcl/3LHV4MQ'
26 b'B8KLYOeB5SrHBZQqKPeaeeyZBio2VRWIuVEyimdQXEVQLoNWyyBvPQx1kLHMxtCUEmAdMJo2'
27 b'A4rgW4/vnXPf/wEwBqgPSn+RKV0FxQOV2TAzRYY2BrYLjEZYthmcy4F8iIbh9i+wgtB/Quc/'
28 b'wvYAkAnoaatQIGk237ng/uOahphi5NkQAfTFlVl4rczDkw9aLhTnQ3EukAfkA9ly8qHjTQhN'
29 b'M9yscaaL0Xdtuw0YBmbTton/tm3s9Eet6tuXfpwDSZmPrMzikfASNkeOB8iWq1uuZeDthLu/'
30 b'JHQXOi+osZ8I6ybQCdwCwuk8hSL/dnfqtU9aXN1dP8sEGxCABhjSkBsJny3hc5HroskBiiGe'
31 b'gBvHsMPQf9bBT0P27SFbfAbcBMYBM50GzGcqc4JOTYtHHTqIBfvADf2tMN63AP5/nYL5aX0L'
32 b'Zrx4W1Te7cZ72rKuSfh+IAaQtj3w900r8rW49rPGvbObt740CyqQA7YHhq6AoxXEGgPxWB7K'
33 b'orQXXEv4chg8D71nmR2Dtg8dieOpZBvwmZwAINJm4B92VpSrKeXt7c+Fdu74Sgh0IBvsTBj+'
34 b'BNw9sKzJCVuKH1CZvAXwpWA6oPsn0HESMwJ95wzembF6R2zRJeFldSAtBg79QUWBaitvPfHl'
35 b'4M5tL4RAmeexnND/EeQNQ9F2F2wqAWVhTXKQBuSUQsgHl9+A0U6iAbj9C4Nzner4iWSyBWiT'
36 b'1YkDpMXAoc9XLSOhnGx6PvDEthdDIOaZUg4YuABFo5C/RcIjockHIeGVAmmiCLyt8/DhENND'
37 b'Ct3vO8V/9YmRH8Xjl4BWmb4fEGkx8De7qstIKe827Q9ubXo+CGKeMWVAfzOU+CG30Qkbli04'
38 b'1wvAcsOtK5AQ0PASGC747C3ofg9zTjDQqtN53kgd96W6z8RTLcB14ArgBcy0vJH99VMrl+uW'
39 b'8t9PvTjTsGVfENR5xriAwQtQkQD34xmwugRELtjZoJVB3IK2j8A3CSbgKgQyYWaE2QnoOJvB'
40 b'r7oU35HZ+PV7pt0hk28DxoBEWt6J/2p3zXIs/nP3H003NO4NgS3v9hYMnYcKE9xbMqFOJt8/'
41 b'CoF+KInDSD/4pxlp0wlPKdRvnkbXYaRDo/PDDHFiyOw9EY61mII2Cd8H+Bcn/1tX6LV9tZV2'
42 b'Ujn9hf0zGxt3y84XQDgBIxehUgH3JhfUlcz3vM8LEz5IAoGrkIKeXxl8+kFWMhrFDIzGMjPd'
43 b'Nm2fOuM/9cXbL0WT14FrEn4EiC3u/G9doYNP16/WFfudPftn1m3fEwANyIfZCEx+CisMyNjo'
44 b'gYplkDCgbxSCIe616oz3OKjbFGPwZgbnPnQFj47PXRtLWgNfK8hc71aUvJPB2K3hpNUt+94O'
45 b'TAKptH0X+u4X66s1VZx+9ku+9Zs+J5MvgmAAxi9DtQdcFRqUecBywVgIwjGGr+qceycnMeZX'
46 b'Ig2FIq/DZ/le94Y+Dlvihux2BCgBHMAgcBcIAhZAWgx8d399vbCV95550bdq25MBsIFC8M+A'
47 b'rwVWFoBR4YCkCXEBKcCEnotOms/kJI8OzrbeDMbb13oMx0A0FYhaYgi4KvudAtyACkQWViYN'
48 b'BubhFXhv74HpVTt2+0GZhw/OwNRVqC4EvSELDAf0B7j7iYGvTycRU7nanhk9OhC62juXaAFa'
49 b'gHsSLgRMAFHSoF97Ch38Yv0qTVU+ePGl8ap122ZBwk/eg7lOWFkG2hoPFJaCN4A1B5cv5tsf'
50 b'dCSHA0nT/1nA3zsZN7tk2h1AAACw5aRN+gPg1yqKcvoFCQ/z8BPDELkNK8tBrfdAQT6ETAhG'
51 b'iIRUBn2Efz4SuGwJ0S77PAwMAbOLoR+agYMH6uo0ldP7np2sWS/hKYbxAYj1zsMrHhXmkjAx'
52 b'ClETTAhNuZiO2OH78EPAZaBHdjoJCIBHYiCVUnbVrI7VbH1C3mHzYLQXbC+srJPfaiIWCW+C'
53 b'0ISC3+dgZsLAO5TJaDjpB3zAOBBckr/QJE1RkJ1joqiAB0buAGNQUaNAuRumYkSmFc4cK2Rg'
54 b'1EhMzNnhqYgZHAjFRtumI63AIBAGWBIDwlZy3R4TnDDUCVoUyuuAqhxIaRCZo68ri1Pt2siZ'
55 b'3rErKVt4gUlgBhgB+oDZJTOgqSLf4zHx9YMRh7KVQEkWZGZDzxSpabja4rGujQe678O3ANeA'
56 b'Cdn3sFzNJTPgdInCnIIk7mxwVwIpYDIK3hiYFn09blr6lGlvKH4HaAPa03Wmp8WAQ6fIFUlh'
57 b'TcDMkMzSslEswILW1mxxfWy2FxgAvDJx/t8YiCXsnlOnlq1NpixNgIoUCHRUtXvSnrrlC7cD'
58 b'd4ApQLDEWvwoUQxsBxqAzEWAiixV34K3JIsl1IOehYwF74AaiwU2MIv8/gyw9AZ+/98qS6v/'
59 b'AUoSr1gPNRy7AAAAAElFTkSuQmCC')
60 #---------------------------------------------------------------------------
61 class MyFrame(wx.Frame):
62 def __init__(self):
63 wx.Frame.__init__(self, None, title=wx.GetApp().GetAppName())
64 self.SetIcon(wx.Icon('wxwin.ico'))
65 self._createControls()
66 self.CenterOnScreen()
67 def _createControls(self):
68 # A Statusbar in the bottom of the window
69 self.CreateStatusBar(1)
70 sMsg = 'wxPython ' + wx.version() + ' - ' + wx.GetLibraryVersionInfo().VersionString
71 self.SetStatusText(sMsg)
72 # Add a panel to the frame (needed under Windows to have a nice background)
73 pnl = wx.Panel(self, wx.ID_ANY)
74 szrMain = wx.BoxSizer(wx.VERTICAL)
75 szrMain.AddSpacer(15)
76 label = wx.StaticText(pnl, wx.ID_STATIC, 'Well done!.\nYou have successfully entered the required password.')
77 szrMain.Add(label, 0, wx.ALL, 15)
78 szrMain.AddSpacer(15)
79 pnl.SetSizer(szrMain)
80 szrMain.SetSizeHints(self)
81 #---------------------------------------------------------------------------
82
83 class MyDlgLogin(wx.Dialog):
84 def __init__(self, parent, password, maxAttemps):
85 wx.Dialog.__init__(self, parent, title='Restricted access')
86 self._iMaxAttemps = maxAttemps
87 self._iAttemps = 0
88 self._sPassword = password
89 self._createInterface()
90 self._txtPwd.SetFocus()
91 self._connectControls()
92 self.CenterOnParent()
93 def _createInterface(self):
94 szrMain = wx.BoxSizer(wx.VERTICAL)
95 lnszr = wx.BoxSizer(wx.HORIZONTAL)
96 bmpCtrl = wx.StaticBitmap(self, wx.ID_STATIC, Key_Png.GetBitmap())
97 lnszr.Add(bmpCtrl, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 10)
98 label = wx.StaticText(self, wx.ID_STATIC, 'Access to this application has been\nprotected with a password.')
99 lnszr.Add(label, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 10)
100 szrMain.Add(lnszr, 0, wx.ALL, 0)
101 label = wx.StaticText(self, wx.ID_STATIC, 'For this test application, the password is "' + self._sPassword + '"')
102 szrMain.Add(label, 0, wx.LEFT|wx.RIGHT|wx.BOTTOM, 10)
103 self._lblWrongPwd = wx.StaticText(self, wx.ID_STATIC, 'Incorrect password!')
104 self._lblWrongPwd.SetFont(label.GetFont().MakeBold())
105 self._lblWrongPwd.SetForegroundColour(wx.RED)
106 szrMain.Add(self._lblWrongPwd, 0, wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.ALIGN_CENTER_HORIZONTAL, 10)
107 lnszr = wx.BoxSizer(wx.HORIZONTAL)
108 label = wx.StaticText(self, wx.ID_STATIC, 'Enter the access password:')
109 lnszr.Add(label, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 0)
110 self._txtPwd = wx.TextCtrl(self, wx.ID_ANY, '', style=wx.TE_PASSWORD)
111 lnszr.Add(self._txtPwd, 1, wx.LEFT|wx.ALIGN_CENTER_VERTICAL, 5)
112 szrMain.Add(lnszr, 0, wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.EXPAND, 10)
113 self._chkShowPwd = wx.CheckBox(self, wx.ID_ANY, 'Display password in plain text')
114 szrMain.Add(self._chkShowPwd, 0, wx.LEFT|wx.RIGHT|wx.BOTTOM, 10)
115 btnSzr = self.CreateSeparatedButtonSizer(wx.OK|wx.CANCEL)
116 btnOk = self.FindWindowById(wx.ID_OK)
117 if not btnOk is None:
118 btnOk.SetLabel('Access')
119 btnOk.SetDefault()
120 szrMain.Add(btnSzr, 0, wx.ALL|wx.EXPAND, 10)
121 self.SetSizer(szrMain)
122 self._lblWrongPwd.Hide()
123 szrMain.SetSizeHints(self)
124 def _connectControls(self):
125 self._chkShowPwd.Bind(wx.EVT_CHECKBOX, self._onChkShowPasswordClicked)
126 self.Bind(wx.EVT_BUTTON, self._onBtnOkClicked, id=wx.ID_OK)
127 def _onChkShowPasswordClicked(self, evt):
128 self.Freeze()
129 sPass = self._txtPwd.GetValue()
130 lnszr = self._txtPwd.GetContainingSizer()
131 iStyle = 0
132 if not self._chkShowPwd.IsChecked():
133 iStyle = wx.TE_PASSWORD
134 lnszr.Detach(self._txtPwd)
135 self._txtPwd.Destroy()
136 self._txtPwd = wx.TextCtrl(self, wx.ID_ANY, sPass, style=iStyle)
137 lnszr.Add(self._txtPwd, 1, wx.LEFT|wx.ALIGN_CENTER_VERTICAL, 5)
138 lnszr.Layout()
139 self.Thaw()
140 def _onBtnOkClicked(self, evt):
141 iRes = wx.ID_OK
142 if self._txtPwd.GetValue() != self._sPassword:
143 iRes = wx.ID_CANCEL
144 if (iRes == wx.ID_OK) or (self._iAttemps == (self._iMaxAttemps - 1)):
145 self.EndModal(iRes)
146 if self._iAttemps == 0:
147 self._lblWrongPwd.Show()
148 self.GetSizer().SetSizeHints(self)
149 self.CenterOnParent()
150 self._txtPwd.SetFocus()
151 self._txtPwd.SetSelection(-1, -1)
152 self._iAttemps += 1
153 self._lblWrongPwd.SetLabel('Incorrect password: trial {:0d}/{:0d}'.format(self._iAttemps+1, self._iMaxAttemps))
154 self.GetSizer().Layout()
155
156 #---------------------------------------------------------------------------
157 class MyApp(wx.App):
158 def OnInit(self):
159 print('Running wxPython ' + wx.version())
160 self.locale = wx.Locale(wx.LANGUAGE_ENGLISH)
161
162 # Set Current directory to the one containing this file
163 os.chdir(os.path.dirname(os.path.abspath(__file__)))
164 self.SetAppName('PwdProtect')
165 dlg = MyDlgLogin(None, 'wxWidgets', 3)
166 if dlg.ShowModal() != wx.ID_OK:
167 wx.MessageBox('You can not access to this application!', 'Password required', wx.ICON_EXCLAMATION|wx.OK|wx.CENTER)
168 return False
169 dlg.Destroy()
170 # Create the main window
171 frm = MyFrame()
172 self.SetTopWindow(frm)
173 frm.Show()
174 return True
175 #---------------------------------------------------------------------------
176
177 if __name__ == '__main__':
178 app = MyApp()
179 app.MainLoop()
Download source
Additional Information
Link : https://wiki.wxpython.org/TitleIndex
Thanks to
Xaviou (sample_one.py coding).
About this page
Date Person (bot) Comments : 25/05/18 - Ecco (Created page for wxPython Phoenix).
Comments
- blah, blah, blah...