我当前正在编写一个程序,该程序允许用户输入列表(例如:9、8、7、6、5、4、3、2、1),该程序应使用选择排序对列表进行排序。排序算法工作正常,但该程序还应该能够打印通过交换元素创建的每个新列表。但是,在我的代码中,这些列表已正确打印到控制台中,但未正确显示在文本框中。
import tkinter as tk
from tkinter import messagebox
import time
class SelectionSort:
def __init__(self):
self.input_list = []
self.output_list = []
self.time = 1000
root.geometry("500x500")
root.resizable(False, False)
root.title("Selection-Sort")
self.titel = tk.Label(root, text="Selection - Sort", font = ("Courier", "19", "underline"), justify="center").pack()
self.text = tk.Text(root, height=22, width=60, relief="solid")
self.text.pack()
self.help_string = "Instructions:\n 1. Numbers have to be seperated using a comma.\n" \
" 2. Only integers are accepted.\n 3.You can view the text again by pressing the help button"
self.text.insert(tk.END, self.help_string)
self.print_button = tk.Button(root, text="Sort input!", command=lambda: self.retrieve_input(), width=68,
relief="groove", activebackground="dark grey").pack()
self.delete_button = tk.Button(root, text="Delete input", command=lambda: self.delete_text(), width=68,
relief="groove", activebackground="dark grey").pack()
self.help_button = tk.Button(root, text="Show help", command=lambda: self.show_help(), width=68,relief="groove",activebackground="dark grey").pack()
def retrieve_input(self):
input = self.text.get("1.0", "end-1c")
curr_value = ""
count = 0
for i in input:
try:
curr_value += i
if i == ",":
final = curr_value.replace(",", "")
self.input_list.append(int(final))
curr_value = ""
else:
if curr_value == "":
pass
except ValueError:
curr_value = ""
count += 1
print(self.input_list)
self.input_list.append(int(curr_value))
print(self.input_list)
if len(self.input_list) == 0:
self.delete_text()
self.text.insert(tk.END, "ERROR")
else:
self.text.delete("1.0", "end")
self.text.insert(tk.END, "Input list: ")
self.text.insert(tk.END, self.input_list)
return self.selection_sort()
def delete_text(self):
self.input_list = []
self.text.delete("1.0", "end")
def show_help(self):
messagebox.showinfo("Help", self.help_string )
def selection_sort(self):
sorted_lists = []
A = self.input_list
count = 1
for i in range(len(A)):
print(A)
self.time += 1000
min_idx = i
for j in range(i + 1, len(A)):
if A[min_idx] > A[j]:
min_idx = j
A[i], A[min_idx] = A[min_idx], A[i]
sorted_lists.append(A)
root.after(self.time, func=lambda:
self.text.insert(tk.END,"\n"+str(A) + "\n"))
count+=1
print("Sorted array")
for i in range(len(A)):
print("%d" % A[i]),
root = tk.Tk()
selection_sort = SelectionSort()
root.mainloop()
答案 0 :(得分:1)
该root.after
通话对我来说似乎很可疑。您对A所做的任何更改都会传播到self.text.insert
调用中,因此,如果您在一秒钟内完成排序,则您的文本框将仅显示完全排序的A形式。
如果将A的副本传递给lambda,并避免在late binding gotcha时碰到{{3}},则文本框应显示A的状态,因为它存在于循环中。
for i in range(len(A)):
print(A)
root.after(self.time, func=lambda A=A.copy(): self.text.insert(tk.END,"\n"+str(A) + "\n"))
self.time += 1000
min_idx = i
for j in range(i + 1, len(A)):
if A[min_idx] > A[j]:
min_idx = j
A[i], A[min_idx] = A[min_idx], A[i]
sorted_lists.append(A)
count+=1