tkinterでbuttonを利用し、連結リストを表示させたい
pythonで連結リストを作りました。その後、tkinterを使って連結リストを操作することができるソフトウェアを作ろうとしています。
しかし、bottonを利用して値を挿入したり、追加するボタンを押しても変化がありません。連結リスト自体はしっかり作動します。
発生している問題・エラーメッセージ
今のところエラーはしておらず、一応GUIが動きます。しかし、望み通りに結果が表示されない。
該当のソースコード
python
1import tkinter as tk 2 3global my_list 4 5 6 7class MyElement: 8 def __init__(self,val): 9 self.val = val 10 self.prev = None 11 self.next = None 12 13 def to_string(self): 14 str_prev = "None" 15 str_next = "None" 16 if self.prev != None: 17 str_prev = str(self.prev.val) 18 if self.next != None: 19 str_next = str(self.next.val) 20 21 return"(" + str(self.val) + "," + str_prev + ", " + str_next + ")" 22 23class MyDoublyLinkedList: 24 def __init__(self): 25 self.head = None 26 self.tail = None 27 28 def append(self, element): 29 30 31 if self.head == None: 32 self.head = element 33 self.tail = element 34 else: 35 self.tail.next = element 36 element.prev = self.tail 37 self.tail = element 38 39 self.to_string() 40 41 def get(self, index): 42 ptr = self.head 43 for i in range(0, index): 44 ptr = ptr.next 45 46 return ptr 47 48 def insert(self, index, element): 49 if index == None: 50 return 51 52 ptr = self.get(index) 53 54 if ptr == None: 55 self.append(element) 56 else: 57 element.prev = ptr.prev 58 element.next = ptr 59 if ptr.prev == None: 60 self.head = element 61 else: 62 ptr.prev.next = element 63 ptr.prev = element 64 65 self.to_string() 66 67 68 def delete(self, element): 69 if element.prev == None: 70 self.head = element.next 71 else: 72 element.prev.next = element.next 73 if element.next == None: 74 self.tail = element.prev 75 else: 76 element.next.prev = element.prev 77 78 79 80 81 def to_string(self): 82 global response_area 83 global stringfied_data 84 global ptr 85 stringfied_data = "[" 86 ptr = self.head 87 while ptr != None: 88 stringfied_data += str(ptr.val) + " " 89 ptr = ptr.next 90 91 stringfied_data += "]" 92 93 response_area.configure(text=stringfied_data) 94 95 def to_string2(self): 96 global stringfied_data1 97 stringfied_data1 = "[" 98 ptr = self.head 99 while ptr != None: 100 stringfied_data1 += str(ptr.val) + " " 101 ptr = ptr.next 102 103 stringfied_data1 += "]" 104 105 return stringfied_data1 106 107 108 109 110def get_value(entryWidget): 111 value = entryWidget.get() 112 try: 113 return int(value) 114 except ValueError: 115 return None 116 117if __name__ == "__main__": 118 119 root = tk.Tk() 120 root.geometry("800x400") 121 root.title("連結リスト") 122 label = tk.Label(root,text="連結リストを利用してみましょう",font=("Times New Roman",20)) 123 label.place(x=0,y=0) 124 125 126 response_area = tk.Label(root,width = 80,height = 2,bg = 'gray') 127 response_area.place(x=0,y=40) 128 129 my_list = MyDoublyLinkedList() 130 my_list.append(MyElement(2)) 131 my_list.append(MyElement(8)) 132 133 #追加する機能 134 txtbox1 = tk.Entry() 135 txtbox1.configure(state='normal',width=20) 136 txtbox1.place(x = 0,y = 130) 137 138 label1 = tk.Label(root,text="(追加したい値)",font=("Times New Roman",10)) 139 label1.place(x=170,y=130) 140 141 button1 = tk.Button(text = '追加',height = 1,width = 10,command = my_list.append(MyElement(txtbox1.get()))) 142 button1.place(x = 0,y = 90) 143 144 #挿入する機能 145 txtbox2 = tk.Entry() 146 txtbox2.configure(state='normal',width=20) 147 txtbox2.place(x = 0,y = 200) 148 149 label2 = tk.Label(root,text="(挿入したい位置)",font=("Times New Roman",10)) 150 label2.place(x=170,y=200) 151 152 153 index = get_value(txtbox2) 154 155 txtbox3 = tk.Entry() 156 txtbox3.configure(state='normal',width=20) 157 txtbox3.place(x = 0,y = 230) 158 159 label3 = tk.Label(root,text="(挿入したい値)",font=("Times New Roman",10)) 160 label3.place(x=170,y=230) 161 162 163 button2 = tk.Button(text = '挿入',height = 1,width = 10,command = my_list.insert(index,MyElement(txtbox3.get()))) 164 button2.place(x = 0,y = 160) 165 166 #削除する機能 167 txtbox4 = tk.Entry() 168 txtbox4.configure(state='normal',width=20) 169 txtbox4.place(x = 0,y = 300) 170 171 label4 = tk.Label(root,text="(削除したい値)",font=("Times New Roman",10)) 172 label4.place(x=170,y=300) 173 174 175 button3 = tk.Button(text = '削除',height = 1,width = 10,command = my_list.delete(MyElement(txtbox4.get()))) 176 button3.place(x = 0,y = 260) 177 178 179 180 181 root.mainloop() 182
試したこと
main関数の中で手動で作った
my_list.append(MyElement(2))
my_list.append(MyElement(8))
はしっかり表示されるので連結リスト自体は間違っていません。
しかし、それぞれEntryで作った空白の値をもとにbottonで同じ機能をさせようとすると下の写真のように何も変化がありません。自分の今のところの考えでは、どこかにglobalを付け加えないと、連結リストが変更されないのではないかと考えています。色々globalなどを付け加えてやってみましたが、何も変わらなかったので、どこを直せばいいか教えていただけると幸いです。
追記
お答えいただいた方のアドバイスをもとに、新しい関数(引数なしで、本来
やりたいことをそこに書いた関数,app,ins,dele)を導入しました。
おかげ様でappend(追加)ボタンを押した際にはしっかりと表示されるようになりました。
しかし、insertとdeleteボタンは前と同様に押しても反応がありません。
思い当たるふしとしましては、二つの共通しているところで、Entry(空白)に打ち込んだものをint型に直すという作業をしています(get_value関数で)。
そのあとエラーがでないように、insert関数,dele関数のところでそれぞれのindexがNoneであるとき、動作を終了するように(returnを記述)しています。
もしかしたら空白に打ち込んだindex,index1がどこかしらで共にNoneになってしまってしまい、変化しないのではないかと思っていますが、色々試してもダメでした…
get_value関数を作るまえに、index = int(txtbox4.get())などとしたのですが、int型に直せないものがあるというように怒られてしまいましたので、この関数を作った次第です。
間違えているところを指摘していただけると光栄です。
新しい関数を付け加えたコードはこちらです。
python
1import tkinter as tk 2 3global my_list 4 5 6class MyElement: 7 def __init__(self,val): 8 self.val = val 9 self.prev = None 10 self.next = None 11 12 def to_string(self): 13 str_prev = "None" 14 str_next = "None" 15 if self.prev != None: 16 str_prev = str(self.prev.val) 17 if self.next != None: 18 str_next = str(self.next.val) 19 20 return"(" + str(self.val) + "," + str_prev + ", " + str_next + ")" 21 22class MyDoublyLinkedList: 23 def __init__(self): 24 self.head = None 25 self.tail = None 26 27 28 def app(self): 29 self.append(MyElement(txtbox1.get())) 30 31 def append(self, element): 32 33 34 if self.head == None: 35 self.head = element 36 self.tail = element 37 else: 38 self.tail.next = element 39 element.prev = self.tail 40 self.tail = element 41 42 self.to_string() 43 44 def get(self, index): 45 ptr = self.head 46 for i in range(0, index): 47 ptr = ptr.next 48 49 return ptr 50 51 def ins(self): 52 self.insert(index,MyElement(txtbox3.get())) 53 54 def insert(self, index, element): 55 if index == None: 56 return 57 58 ptr = self.get(index) 59 60 if ptr == None: 61 self.append(element) 62 else: 63 element.prev = ptr.prev 64 element.next = ptr 65 if ptr.prev == None: 66 self.head = element 67 else: 68 ptr.prev.next = element 69 ptr.prev = element 70 71 self.to_string() 72 73 def dele(self): 74 if index1 == None: 75 return 76 77 y = self.get(index1) 78 my_list.delete(y) 79 80 def delete(self, element): 81 if element.prev == None: 82 self.head = element.next 83 else: 84 element.prev.next = element.next 85 if element.next == None: 86 self.tail = element.prev 87 else: 88 element.next.prev = element.prev 89 90 self.to_string() 91 92 93 94 def to_string(self): 95 stringfied_data = "[" 96 ptr = self.head 97 while ptr != None: 98 stringfied_data += str(ptr.val) + "," 99 ptr = ptr.next 100 101 stringfied_data += "]" 102 103 response_area.configure(text=stringfied_data) 104 105 106 107 108 109 110def get_value(entryWidget): 111 value = entryWidget.get() 112 try: 113 return int(value) 114 except ValueError: 115 return None 116 117if __name__ == "__main__": 118 119 root = tk.Tk() 120 root.geometry("800x400") 121 root.title("連結リスト") 122 label = tk.Label(root,text="連結リストを利用してみましょう",font=("Times New Roman",20)) 123 label.place(x=0,y=0) 124 125 126 response_area = tk.Label(root,width = 80,height = 2,bg = 'gray') 127 response_area.place(x=0,y=40) 128 129 my_list = MyDoublyLinkedList() 130 131 132 #追加する機能 133 txtbox1 = tk.Entry() 134 txtbox1.configure(state='normal',width=20) 135 txtbox1.place(x = 0,y = 130) 136 137 label1 = tk.Label(root,text="(追加したい値)",font=("Times New Roman",10)) 138 label1.place(x=170,y=130) 139 140 button1 = tk.Button(text = '追加',height = 1,width = 10,command = my_list.app) 141 button1.place(x = 0,y = 90) 142 143 #挿入する機能 144 txtbox2 = tk.Entry() 145 txtbox2.configure(state='normal',width=20) 146 txtbox2.place(x = 0,y = 200) 147 148 label2 = tk.Label(root,text="(挿入したい位置)",font=("Times New Roman",10)) 149 label2.place(x=170,y=200) 150 151 152 index = get_value(txtbox2) 153 154 txtbox3 = tk.Entry() 155 txtbox3.configure(state='normal',width=20) 156 txtbox3.place(x = 0,y = 230) 157 158 label3 = tk.Label(root,text="(挿入したい値)",font=("Times New Roman",10)) 159 label3.place(x=170,y=230) 160 161 162 button2 = tk.Button(text = '挿入',height = 1,width = 10,command = my_list.ins) 163 button2.place(x = 0,y = 160) 164 165 #削除する機能 166 txtbox4 = tk.Entry() 167 txtbox4.configure(state='normal',width=20) 168 txtbox4.place(x = 0,y = 300) 169 170 index1 = get_value(txtbox4) 171 172 label4 = tk.Label(root,text="(削除したい位置番号)",font=("Times New Roman",10)) 173 label4.place(x=170,y=300) 174 175 176 button3 = tk.Button(text = '削除',height = 1,width = 10,command = my_list.dele) 177 button3.place(x = 0,y = 260) 178 179 root.mainloop() 180
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/26 14:39
2021/01/26 15:04 編集
2021/01/26 15:21