Графический интерфейс для сортировки: как раскрасить определенные числа на каждом этапе сортировки? - PullRequest
2 голосов
/ 09 февраля 2012

Мой код для пузырьковой сортировки в GUI это: -

def bubble(self):
    def bubble_sort ( array ) :
        swap_test = False
        for i in range ( 0, len ( array ) - 1 ):
         for j in range ( 0, len ( array ) - i - 1 ):
          if array[j] > array[j + 1] :
           array[j], array[j + 1] = array[j + 1], array[j]#elegentan way of swap

           swap_test = True
           break
           #if swap_test == False:
        #else:
        #self.create_label()

   #print('bubble to be implemented')
    bubble_sort(self.nums)
    return self.nums

Итак, я хочу закрасить элементы, которые поменялись местами на один шаг, например поменять местами массив [j] и массив [j + 1].

Функция, используемая для сортировки кнопки и сохранения ее в метке:

def sortit(self):
    function = self.function[self.v.get()]
    result = function()
    num = ''.join('%4i' % num for num in result)
    self.label3 = Label(self, text=num, width=2, height=2)
    self.label3.grid(row=5, columnspan=10, sticky=W+E+N+S )

хорошо, снимок экрана похож на

enter image description here

Итак, что я должен сделать, так это после того, как перестановка в пузырьковой сортировке 8 вышла на первое место, поэтому мне нужно раскрасить числа, которые переставляются не все.

Ответы [ 3 ]

1 голос
/ 09 февраля 2012

У вас есть хотя бы пара вариантов.Во-первых, вы создаете один виджет метки для каждого номера, чтобы вы могли покрасить каждый из них в отдельности.Второй вариант - использовать один текстовый виджет.Текстовый виджет позволяет вам помечать отдельные символы и применять атрибуты к этим тегам.Так, например, у вас может быть тег «перемещен» и задан передний план, фон, шрифт и т. Д. Для всех символов с тегом «перемещен».

Немного подумайте нестандартно - только потому, чтоВиджет в основном используется для ввода, это не значит, что он также не может быть использован для отображения данных.

1 голос
/ 09 февраля 2012

Попробуйте адаптировать этот код к вашему приложению.
Он использует Text виджет с тегами для создания цветного текста.Таким образом, вы должны заменить свои Label виджеты на Text.

from Tkinter import *

class Sorting(Frame):
    def __init__(self):
        Frame.__init__(self)
        self.master.title("Sorting")
        self.master.rowconfigure(5, weight=1)
        self.master.columnconfigure(5, weight=1)
        self.grid(sticky=W+E+N+S )

        nums = [10, 20, 8, 5, 7]       # example of entry
        result = sorted(nums)          # sorted result = [3 ,5 , 8, 10 ,20]

        # the color list holds the items changing position when sortened
        color = [ind for ind, (x, y) in enumerate(zip(nums, result)) if x != y]

        entry_num = ''.join('%4i' % num for num in nums)
        sort_nums = ''.join('%4i' % num for num in result)

        l1 = Label(self,  text="entry", width=25, height=1)
        l1.grid(row=0, column=1, sticky=N)

        t_entry = Text(self,  width=25, height=2)
        t_entry.grid(row=1, column=1, sticky=N)
        t_entry.insert(END, entry_num)

        l2 = Label(self, text='sorted', width=25, height=1)
        l2.grid(row=2, column=1, sticky=N)

        t_sorted = Text(self,  width=25, height=2)
        t_sorted.grid(row=3, column=1, sticky=N)
        t_sorted.insert(END, sort_nums)

        t_sorted.tag_config('red_tag', foreground='red')

        for pos in color:
            a = '1.%i' % (4 * pos)
            b = '1.%i' % (4 * pos + 4)
            t_sorted.tag_add('red_tag', a, b)


if __name__ == "__main__":
    Sorting().mainloop()

enter image description here

0 голосов
/ 09 февраля 2012

это ты хочешь?Я надеюсь, что это может помочь вам.

http://www.python -course.eu / tkinter_labels.php

self.label3 = Label(self, text=num, width=2, height=2, fg= "blue")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...