Tkinter的文本框控件没有正确显示文本

问题描述 投票:0回答:1

我目前正在写一个程序,它允许用户输入列表(例如: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()
python tkinter
1个回答
1
投票

root.after调用看起来可疑我。您对任何更改都将传播到self.text.insert调用,因此,如果你完成第二个下排序中,那么你的文本框将只显示A的完全排序的形式

如果你传递一个副本的拉姆达,并避免late binding gotcha,而你在它,然后在文本框中应显示的状态,因为它在循环中存在。

    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
© www.soinside.com 2019 - 2024. All rights reserved.