質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2913閲覧

python3 tkinterでパスワードの表示・非表示を切り替えたい

Yuiti628

総合スコア71

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/05/02 07:31

##はじめに
PythonでGUIを開発中です。
webdではよくあるパスワードの表示・非表示を実行したいと思います。

調べても良いのが見つからなかったので作ったのですが、困ったので質問します。

現状
0. パスワード入力用にEntryを2個作り、片方はオプションで[show='*']を付ける。
0. 表示のチェックが付いたら、Entryを交互に切り替える。

##困った点
Chk = Checkbutton(Frm1, variable=self.checkView ,text = '表示' , command=lambda: self.Chenge_PW(i)
それぞれのテェックをiで紐付けたかったのですが、このコードではどのチェックをクリックしてもself.Chenge_PWには9が渡されます。

どのようにすれば、各行のチェックボックスのクリックを取得して、パスワードの表示・非表示を切り替えたら良いでしょうか?

そもそも、この方法よりももっとスマートなやり方があれば教えて頂きたいです。

イメージ説明

python

1''' mmain ''' 2# tkinter 3import tkinter as tk 4from tkinter.ttk import * 5from ttkthemes import * 6 7 8class Application(Frame): 9 10 def __init__(self, master=None): 11 Frame.__init__(self,master) 12 self.pack(fill='both') #描写 13 14 #フォームの作成 15 self.CrateMainForm(master) 16 17 18 19 20 #region #メインフォームの作成 21 def CrateMainForm(self,master): 22 23 24 """ 25 アカウント情報 フレーム 26 """ 27 Frm1 = Frame(master) 28 Frm1.pack(padx=10 ,pady=5, fill="both") 29 30 31 self.Widget_items = [] 32 self.check_PW_view = [] 33 for i in range(10): 34 items = [] 35 36 # No ラベル 37 self.L_no1 = Label(Frm1) 38 self.L_no1.configure(text=f"{i+1}",) 39 self.L_no1.grid(row=i +1, column=0) 40 41 42 # パスワード テキストボックス 43 TextPassword = tk.StringVar() 44 self.PasswordBox = Entry(Frm1,textvariable=TextPassword ,width = 13,) 45 self.PasswordBox.grid(row=i +1, column=3, sticky="nw") 46 items.append(self.PasswordBox) 47 48 # パスワード テキストボックス * 49 TextPassword = tk.StringVar() 50 self.PasswordBox_show = Entry(Frm1,textvariable=TextPassword , show='*' ,width = 13,) 51 self.PasswordBox_show.grid(row=i +1, column=3, sticky="nw") 52 items.append(self.PasswordBox_show) 53 54 55 # 表示 チェックボックス 56 self.checkView = tk.BooleanVar() 57 Chk = Checkbutton(Frm1, variable=self.checkView ,text = '表示' , command=lambda: self.Chenge_PW(i)) 58 .grid(row=i +1, column=4, sticky="w") 59 self.check_PW_view.append(self.checkView) 60 61 self.Widget_items.append(items) 62 63 64 65 # パスワードの表示非表示の切り替え 66 def Chenge_PW(self , i): 67 tmp = '' 68 # 表示 69 pw_view = self.Widget_items[i][0] 70 pw_Asterisk = self.Widget_items[i][1] 71 72 # falseなら表示する方に 73 if self.check_PW_view[i].get(): 74 pw_Asterisk.grid_remove() 75 pw_view.grid() 76 77 tmp = pw_Asterisk.get() 78 else: 79 pw_view.grid_remove() 80 pw_Asterisk.grid() 81 82 tmp = pw_view.get() 83 84 pw_view.delete(0, tk.END) 85 pw_view.insert(0, tmp) 86 pw_Asterisk.delete(0, tk.END) 87 pw_Asterisk.insert(0, tmp) 88 89 return 90 91#main 92if __name__ == "__main__": 93 94 root = ThemedTk() 95 app = Application(master=root) 96 app.mainloop() 97 98

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

全部9になるのは、forループの中で、self.PasswordBoxなどが使い回されていたためと思います。
10個passwordのformを作ってもself.PasswordBoxに上書きしていたりで、
最後の10個目のインスタンスだけ参照できるようになっていたと思われます。

以下のように passwordのformを1個づつ独立して生成するよう make_passbox()関数として外に出してみたところ、
当初の想定通りの動作をしていると思います。

python

1''' main ''' 2# tkinter 3import tkinter as tk 4from tkinter.ttk import * 5from ttkthemes import * 6 7 8def make_passbox(master, i, cb_change): 9 Frm1 = Frame(master) 10 Frm1.pack(padx=10 ,pady=5, fill="both") 11 12 items = [] 13 14 # No ラベル 15 L_no1 = Label(Frm1) 16 L_no1.configure(text=f"{i+1}",) 17 L_no1.grid(row=i +1, column=0) 18 19 # パスワード テキストボックス 20 TextPassword = tk.StringVar() 21 passwordBox = Entry(Frm1,textvariable=TextPassword ,width = 13,) 22 passwordBox.grid(row=i +1, column=3, sticky="nw") 23 items.append(passwordBox) 24 25 # パスワード テキストボックス * 26 TextPassword = tk.StringVar() 27 passwordBox_show = Entry(Frm1,textvariable=TextPassword , show='*' ,width = 13,) 28 passwordBox_show.grid(row=i +1, column=3, sticky="nw") 29 items.append(passwordBox_show) 30 31 def change_pass(): 32 cb_change(i) 33 34 # 表示 チェックボックス 35 checkView = tk.BooleanVar() 36 Chk = Checkbutton(Frm1, 37 variable=checkView, 38 text = '表示', 39 command=change_pass).grid(row=i +1, column=4, sticky="w") 40 41 return checkView, items 42 43 44class Application(Frame): 45 46 def __init__(self, master=None): 47 Frame.__init__(self,master) 48 self.pack(fill='both') #描写 49 #フォームの作成 50 self.CrateMainForm(master) 51 #self.PasswordBox = [None] * self._col_num 52 53 54 #region #メインフォームの作成 55 def CrateMainForm(self, master): 56 """ 57 アカウント情報 フレーム 58 """ 59 self.Widget_items = [] 60 self.check_PW_view = [] 61 62 for i in range(10): 63 pw_view, witems = make_passbox(master, i, self.Change_PW) 64 self.check_PW_view.append(pw_view) 65 self.Widget_items.append(witems) 66 67 68 # パスワードの表示非表示の切り替え 69 def Change_PW(self , i): 70 tmp = '' 71 # 表示 72 pw_view = self.Widget_items[i][0] 73 pw_Asterisk = self.Widget_items[i][1] 74 75 # falseなら表示する方に 76 if self.check_PW_view[i].get(): 77 pw_Asterisk.grid_remove() 78 pw_view.grid() 79 80 tmp = pw_Asterisk.get() 81 else: 82 pw_view.grid_remove() 83 pw_Asterisk.grid() 84 85 tmp = pw_view.get() 86 87 pw_view.delete(0, tk.END) 88 pw_view.insert(0, tmp) 89 pw_Asterisk.delete(0, tk.END) 90 pw_Asterisk.insert(0, tmp) 91 92 return 93 94#main 95if __name__ == "__main__": 96 root = ThemedTk() 97 app = Application(master=root) 98 app.mainloop()

投稿2021/05/02 08:14

編集2021/05/02 08:24
hide5stm

総合スコア426

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Yuiti628

2021/05/02 08:31

ありがとうございます。 管理のために、`make_passbox `を`Application `クラスの中に入れても動作しました。 使いわ回しはダメだったんですね。 独立していると思っておりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問