Виджет текстового поля Tkinter некорректно отображает текст - PullRequest
0 голосов
/ 04 февраля 2019

В настоящее время я пишу программу, которая позволяет пользователю вводить список (например: 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 голосов
/ 04 февраля 2019

Этот root.after вызов кажется мне подозрительным.Любые изменения, внесенные вами в A, будут распространяться на вызов self.text.insert, поэтому, если вы закончите сортировку менее чем за секунду, в текстовом поле будет отображаться только полностью отсортированная форма A.

Если вы передадитескопируйте A в лямбду и избегайте поздней привязки gotcha , пока вы в ней, тогда в текстовом поле должно отображаться состояние 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...