2017-04-05 1 views
1

파이썬으로 작성된 간단한 프로그램을 어떻게 완성 할 수 있는지 알 수 없습니다. 프로그램은 기본적으로 10 개의 난수 배열을 생성 한 다음이를 bubblesort 알고리즘을 사용하여 정렬합니다. 전체 단락 프로세스가 화면에 표시해야한다 - 등이 하나 개tkinter에서의 거품 색 시각화

enter image description here

내 현재 코드로 이것이다 :

import tkinter 
import random 
canvas = tkinter.Canvas(bg='white',width='800',height='400') 
canvas.pack() 

c = [] 
for i in range(0,10): 
    c=c+[random.randrange(10)] 
print(c) 
print('Zoradenie...', c) 

def sort(c): 
    x=300 
    for i in range(0,10): 
     for j in range(0,len(c)-1-1): 
      if c[j+1]<c[j]: 
       c[j+1],c[j]=c[j],c[j+1] 
       canvas.create_text(300,80,text=c[j],fill='Red') 
      x+=25 
      canvas.update() 
      canvas.after(1000) 
      print(c)    
    return c 
sort(c) 

하지만 화면에 숫자를 표시하는 방법을 알아낼 수 없습니다. 어떤 아이디어?

+0

답변을위한 작업 코드 나 질문을 보지 못한 이유를 모르겠습니다. 'canvas.create_text'를 사용하여 캔버스에 숫자를 입력합니다. 코드에 문제가있는 것은 모든 숫자를 표시하는 것으로 시작하지 않고 스와핑 한 후 양쪽 모두를 표시하지 않고 'x'를 사용하여 표시 위치를 이동하지 않는 것입니다. 'canvas.after 호출에 함수 이름이 없으므로 루프 안에 있으면 안됩니다. –

답변

1

캔버스에 숫자를 표시하려면 각 숫자에 대한 텍스트 항목을 만들어야합니다. 내 코드의 끝을 참조하십시오. 더 어려운 부분은 숫자 이동입니다. 한 가지 방법은 delete이며 다시 작성하십시오. 다른 하나는 move입니다. 나는 후자를 선택한다.

아마도 가장 힘든 부분은 시간 지연입니다. mainloop을 사용하는 경우 time.sleep (반복을 차단)이 아닌 after을 사용해야하며 애니메이션의 for 루프는 사용하지 않아야합니다. 문제는 for-loops를 자연스럽게 포함하고있는 함수 (여기 sort)가 조인트 연산을 이해하기 어려울 수있는 조각으로 분리되어야한다는 것입니다. 하나의 기능 만 실행 중이고 사용자 상호 작용 (예 : 일시 중지 버튼)에 신경 쓰지 않으면 time.sleepupdate을 사용할 수 있습니다. 나는 여기서 무엇을 더 명확하게 할 수 있도록 그렇게하였습니다. 이 코드는 매우 쉽게 예를 들어, 컬러 바 디스플레이와 텍스트 자리 표시를 대체 할 수

from random import randrange 
from time import sleep 
import tkinter as tk 

root = tk.Tk() 
canvas = tk.Canvas(root, bg='white', width='800', height='400') 
canvas.pack() 

ndigits = 10 
digits = [randrange(10) for _ in range(ndigits)] 
tdelta1, tdelta2 = .8, .2 
xstart = 300 
xdelta = 25 
y = 80 

def color(i, swap): 
    "Temporarily color digits i and i+i according to swap needed." 
    x = xstart + xdelta * i 
    dcolor = 'Red' if swap else 'green' 
    canvas.itemconfigure(items[i], fill=dcolor) 
    canvas.itemconfigure(items[i+1],fill=dcolor) 
    canvas.update() 
    sleep(tdelta1) 
    canvas.itemconfigure(items[i], fill='Black') 
    canvas.itemconfigure(items[i+1], fill='Black') 
    canvas.update() 
    sleep(tdelta2) 

def swap(i): 
    digits[i], digits[i+1] = digits[i+1], digits[i] 
    canvas.move(items[i], xdelta, 0) 
    canvas.move(items[i+1], -xdelta, 0) 
    items[i], items[i+1] = items[i+1], items[i] 


def bubsort(): 
    "Sort digits and animate." 
    for stop in reversed(range(1, ndigits)): 
     # stop = index of position whose entry will be determined. 
     for i in range(stop): 
      swap_needed = digits[i] > digits[i+1] 
      color(i, swap_needed) 
      if swap_needed: 
       swap(i) 
       color(i, False) 

# Create display items and pause. 
items = [canvas.create_text(xstart + xdelta*i, y, text=str(digit)) 
     for i, digit in enumerate(digits)] 
canvas.update() 
sleep(tdelta1) 

bubsort(). 이것을 더욱 발전시키기 위해 int 값과 항목을 속성으로 결합하는 항목 클래스를 정의합니다. 그 (것)들은 결합한 품목의 단지 1 배열 일 것입니다. 비교 메서드를 정의하면 배열을 모든 정렬 함수에 전달할 수 있습니다.