2012-02-09 11 views
2

私のコードは、GUIにあるこのです: -ソート用の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]はのような1つのステップのためswapedされており、配列[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) 

OKのスクリーンショットは

enter image description here

のようですので、私は何をしているのは、バブルにスワップした後のようなものですソート8が最初に来たので、すべてではなくスワップされている数字に色を付ける必要があります。

答えて

1

このコードをアプリケーションに適用してください。
タグ付きの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

ok私はこれを試しましたが、23のような最初の数字だけを青色で表示していて、それを任意の数にランダムに表示しています。だから、私は何をしようとしていたのは、各要素のテキストボックスを別々にして、スワップされている参加者を色付けすることです。しかし、それは最後の数字だけを表示するので、私はちょうど上記のコードで問題の与えられたforループを適用しました。しかし、それは動作していません –

+0

私は参照のための私の完全なコードの残りの部分を追加することができます...私もループのために試みたが動作していない.. –

+0

青で?彼らは赤です!あなたは前進する前に何をしているのかを理解しなければなりません。私の質問の方法は一般的なもので、具体的ではないが、唯一の制限は、数値は999以下でなければならないということである。間違った番号に色を付けると、それはテキストタグ付け戦略の障害ではありません。数字の文字列の構造やタグの動作方法、タグインデックスの設定方法などを確認し、間違ったことを発見します。また、関数呼び出しと引数がどのように機能するかを確認する必要があります。あなたのコード内のbubble_sortバブルの呼び出しは、非常にひどく冗長です。 – joaquin

0

これは何ですか?私はこれがあなたを助けることを望む。

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

self.label3 = Label(self, text=num, width=2, height=2, fg= "blue") 
+0

それは面白いかもしれ@saira_jane私はすべてのものをスワップするだけで1を着色する.... –

+0

を必要としません。しかし、どのように2つのラベルを追加すると思いますか?したがって、左のラベルに1文字だけを入れてください。 –

+1

私は今それをチェックしました –

1

あなたは選択肢の少なくともいくつかあります。 1つは、各番号ごとに1つのラベルウィジェットを作成して、それぞれを個別に色付けできるようにすることです。 2番目の選択肢は、単一のテキストウィジェットを使用することです。テキストウィジェットを使用すると、個々の文字にタグを付け、それらのタグに属性を適用できます。たとえば、タグを「移動」させて、「移動」タグを含むすべての文字の前景、背景、フォントなどを設定することができます。

ほとんどの場合、ウィジェットは入力に使用されているという理由だけで、データを表示することはできません。

関連する問題