🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Tkinter

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

Q&A

解決済

1回答

4057閲覧

tkinterプログラムで検索機能を付けたい

help-me0042

総合スコア10

Tkinter

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

0グッド

0クリップ

投稿2019/12/10 14:56

編集2019/12/10 21:33

検索機能をつけたく、調べて書いたのですがうまく動作しません。
このコードはどのような動作をしてしまっているのでしょうか。

python

1コード #ファイルから呼び込み 2 def button_clickld(self): 3 if os.path.isfile(self.path) == False: 4 self.Label1["text"] = u"ファイルがありません" 5 return 6 with open(self.path,'rb') as file_a: 7 self.save_list = pickle.load(file_a) 8 for N in self.save_list[0]: 9 self.ListBox1.insert(tk.END,N) 10 self.id_list = self.save_list[1] 11 self.pass_list = self.save_list[2] 12 self.Label1["text"] = u"呼び込みました" 13 self.save_list = []

このプログラムは何と言っているのでしょうか。
修正すべきところを教えてほしいです。

テキストエディタはVScodeで書いています。
フレームワークはtkinterです。
宜しくお願いします。

追記
期待する動作
データベースに保存された情報を呼び出したいと考え作りました。
実際の動作
名前を入れるとデータベースから逆に引っ張ってこれるようなプログラムを組んだつもりでいたのですが(検索機能を付けたつもり)、実際にはデリートしたプログラムを復元するような動きになってしまっています。
どうしても検索機能を付けたいのですが、うまくいかず、、、
知恵をお貸しいただきたいです。

読み込むファイルはpickleを想定しているようですが、そのファイルを生成するために必要な方法についても記載をお願いします。
この部分のファイルを生成するために必要な方法という部分がよくわからず明記することができませんでした。
すみません
コード全文```python
import sys
import tkinter as tk
import pickle
import os

class Application(tk.Frame):
def init(self, master=None):
super().init(master)
self.grid()
self.create_widgets()
self.master.title(u"パスワード一覧")
self.master.geometry("512x512")
self.id_list = []
self.pass_list = []
self.save_list = []
self.path = os.path.join(os.path.dirname(file),'file_data.dat')

def create_widgets(self): #リストボックス self.ListBox1 = tk.Listbox(self,height=16,width=32) self.ListBox1.grid(row=0,column=0,padx=5,pady=5,sticky=tk.N) self.ListBox1.bind("<Delete>",self.Delete_press) self.ListBox1.bind("<Shift-Delete>",self.Ins_press) self.ListBox1.bind("<Double-1>",self.Show_press) #スクロールバー self.scrollbar1 = tk.Scrollbar(self,orient=tk.VERTICAL,command=self.ListBox1.yview) self.ListBox1['yscrollcommand'] = self.scrollbar1.set self.scrollbar1.grid(row=0,column=1,sticky=tk.W+tk.N+tk.S) #入力ボックスフレーム self.in_f = tk.Frame(self.master) #入力ボックス1 self.Label2 = tk.Label(self.in_f,text=u'Name') self.Label2.grid(row=0) self.TextBox1 = tk.Entry(self.in_f,width=32) self.TextBox1.grid(row=1) #入力ボックス2 self.Label3 = tk.Label(self.in_f,text=u'ID') self.Label3.grid(row=2) self.TextBox2 = tk.Entry(self.in_f,width=32) self.TextBox2.grid(row=3) #入力ボックス3 self.Label4 = tk.Label(self.in_f,text=u'Password') self.Label4.grid(row=4) self.TextBox3 = tk.Entry(self.in_f,width=16) self.TextBox3.grid(row=5) #入力ボタン self.Button1 = tk.Button(self.in_f,text=u'入力ボタン',width=20,command=self.button_clickin) self.Button1.grid(row=6,pady=20) #入力ボックスフレームの表示 self.in_f.grid(row=0,column=2) #クリアボタン self.Button4 = tk.Button(text=u'クリアボタン',width=20,command=self.button_clickcr) self.Button4.grid(row=1,column=2,pady=5) #保存ボタン self.Button2 = tk.Button(text=u'保存ボタン',width=20,command=self.button_clicksv) self.Button2.grid(row=2,column=0,pady=5) #呼び込みボタン self.Button3 = tk.Button(text=u'呼込ボタン',width=20,command=self.button_clickld) self.Button3.grid(row=2,column=2,pady=5) #パスワード作成ボタン self.Button5 = tk.Button(text=u'パスワード作成',width=20,command=self.button_clickpw) self.Button5.grid(row=3,column=2,pady=5) #通知ラベル self.Label1 = tk.Label(root,text=u'処理結果を表示します') self.Label1.grid(row=4,pady=20,sticky=tk.W+tk.S) #入力のクリア def button_clickcr(self): self.TextBox1.delete(0,tk.END) self.TextBox2.delete(0,tk.END) self.TextBox3.delete(0,tk.END) self.TextBox1.focus_set() self.Label1["text"] = u"入力クリアしました"

#パスワード作成
def button_clickpw(self):
self.TextBox3.delete(0,tk.END)
self.Val = pw.pass_make()
self.TextBox3.insert(tk.END,self.Val)
self.Label1["text"] = u"パスワードを作成しました"

#データ入力 def button_clickin(self): self.Val = self.TextBox1.get() if self.Val == '': self.Label1["text"] = u"入力されていません" return self.ListBox1.insert(tk.END,self.Val) self.Val = self.TextBox2.get() self.id_list.append(self.Val) self.Val = self.TextBox3.get() self.pass_list.append(self.Val) self.button_clickcr() self.Label1["text"] = u"入力しました" #ファイル保存 def button_clicksv(self): self.save_list.append(list(self.ListBox1.get(0,tk.END))) self.save_list.append(self.id_list) self.save_list.append(self.pass_list) with open(self.path,'wb') as file_a: pickle.dump(self.save_list,file_a) self.Label1["text"] = u"保存しました" self.save_list = [] #ファイルから呼び込み def button_clickld(self): if os.path.isfile(self.path) == False: self.Label1["text"] = u"ファイルがありません" return with open(self.path,'rb') as file_a: self.save_list = pickle.load(file_a) for N in self.save_list[0]: self.ListBox1.insert(tk.END,N) self.id_list = self.save_list[1] self.pass_list = self.save_list[2] self.Label1["text"] = u"呼び込みました" self.save_list = [] #項目の削除 def Delete_press(self,event): self.Val = self.ListBox1.index(tk.ACTIVE) self.ListBox1.delete(self.Val,self.Val) del self.id_list[self.Val] del self.pass_list[self.Val] self.Label1["text"] = u"指定場所を削除しました" #項目の挿入 def Ins_press(self,event): self.Val = self.ListBox1.index(tk.ACTIVE) self.ins_Val = self.TextBox1.get() self.ListBox1.insert(self.Val,self.ins_Val) self.ins_Val = self.TextBox2.get() self.id_list.insert(self.Val,self.ins_Val) self.ins_Val = self.TextBox3.get() self.pass_list.insert(self.Val,self.ins_Val) self.button_clickcr() self.Label1["text"] = u"挿入しました" #項目の表示 def Show_press(self,event): self.Val = self.ListBox1.index(tk.ACTIVE) self.N = self.ListBox1.get(self.Val) self.button_clickcr() self.TextBox1.insert(tk.END,self.N) self.TextBox2.insert(tk.END,self.id_list[self.Val]) self.TextBox3.insert(tk.END,self.pass_list[self.Val]) self.master.clipboard_clear() self.master.clipboard_append(self.pass_list[self.Val]) self.Label1["text"] = u"表示しました"

#本体
if name == 'main':
root = tk.Tk()
app = Application(master=root)
app.mainloop()

コード

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

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

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

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

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

hayataka2049

2019/12/10 15:43

幾つか修正依頼があるので、質問に反映してください。 ・コードは<code>ボタンで挿入できるコードブロックのmarkdownを用いて記載してください。そうしないとインデントが潰れるなどして読めなくなります。 ・部分的なコードではどのように動作しているのかわからないので、全体をご提示ください。 ・うまく動作しないとはどのような動作でしょうか? 期待する動作にならない場合は、期待する動作と実際の動作を具体的に記載してください。また、エラーが出る場合はエラーメッセージの全文(traceback先頭から)を記載してください。 ・断片的に見えるコードから判断する限り、そのコードの動作は保存されたファイルによって変わるように思われます。読み込むファイルはpickleを想定しているようですが、そのファイルを生成するために必要な方法についても記載をお願いします。
guest

回答1

0

ベストアンサー

ロードしたデータを ListBox反映する前に、一度ListBoxを全削除しておく必要があります。

あと全体的に、メンバー変数にする必要の無いものまでメンバー変数になっております(selfがついている)。ValNsave_list やなどはローカル変数で十分ですのでメンバー変数から削除したほうが良いと思います。

Python

1 # ファイルから呼び込み 2 def button_clickld(self): 3 if os.path.isfile(self.path) == False: 4 self.Label1["text"] = u"ファイルがありません" 5 return 6 with open(self.path,'rb') as file_a: 7 save_list = pickle.load(file_a) 8 self.ListBox1.delete(0, tk.END) #<- 追加 9 for N in save_list[0]: 10 self.ListBox1.insert(tk.END, N) 11 self.id_list = save_list[1] 12 self.pass_list = save_list[2] 13 self.Label1["text"] = u"呼び込みました"

投稿2019/12/11 00:34

magichan

総合スコア15898

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

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

help-me0042

2019/12/11 05:35

ありがとうございます!!ちゃんと動きました! このプログラムに検索機能を付けたいのですが、可能でしょうか? サンプルコードがググっても見つからないので、もしよろしければ教えて頂きたいです。
magichan

2019/12/11 10:56

例えば、検索対象が hoge だとすると target_word = 'hoge' idx = self.ListBox1.get(0, tk.END).index(target_word) password = self.pass_list[idx] id = self.id_list[idx] のように 対象の場所(idx) と ID と Password を得ることができますので、あとは頑張ってなんとかしてください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問