Tkinter文本框小部件无法正确显示文本

时间:2019-02-04 16:22:14

标签: python tkinter

我当前正在编写一个程序,该程序允许用户输入列表(例如: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()

1 个答案:

答案 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